我是一名学生,使用sakila dvd租赁数据库做一个项目,使用PostgreSQL 15.2和pgAdmin4。经过一些其他工作,我有以下代码填充一个表,该表将比较类别之间的租赁持续时间和频率:
INSERT INTO summary (store_id, cat_group, total_rentals, total_titles, avg_rental_duration)
SELECT DISTINCT detailed.store_id, cat_group_fx(detailed.category_name),
(SELECT COUNT (detailed.rental_id)
FROM detailed, summary AS selfsum
WHERE selfsum.store_id = detailed.store_id
AND cat_group_fx(detailed.category_name) = selfsum.cat_group
GROUP BY detailed.store_id, selfsum.cat_group),
(SELECT COUNT (inventory.inventory_id)
FROM inventory, detailed, summary AS selfsum
WHERE inventory.film_id = detailed.film_id
AND inventory.store_id = detailed.store_id
AND detailed.store_id = selfsum.store_id
AND cat_group_fx(detailed.category_name) = selfsum.cat_group
GROUP BY detailed.store_id, selfsum.cat_group),
AVG(rental.return_date - rental.rental_date)
FROM detailed, rental
GROUP BY detailed.store_id, detailed.category_name;
当我运行整个代码(大约60行)时,我得到的汇总表中的total_rentals和total_titles的整列都是[null]。example
但是当我突出显示并单独运行每个SELECT COUNT语句时,它奇迹般地计数,并且计数显示正确,如下图所示。
为什么会发生这种情况&我怎样才能把计数值放到主表中?
更多信息编辑:cat_group_fx是一个用户函数,它将租赁按流派分类,使用IN进行比较,使用CASE进行排序。“detailed”是另一个表,它位于代码的更上方,只是从各个Sakila表中收集数据,包括rental_id,film_id,store_id,category.name,rental_date和return_date。表是收集和协调相关的粒度数据,然后使用聚合和用户函数将其转换为此处显示的“摘要”表。它是作业的一部分。
1条答案
按热度按时间chhqkbe11#
select语句中的每一列都需要在结果集中的每一行返回一个值。如果该列是计算的,那么该计算需要返回一个值。
如果计算涉及另一个select语句(而不是简单的加法),那么它就是子查询。
如果子查询被链接回主查询,则子查询是“相关的”,例如
使用WHERE T2.PARENT_ID = T1.ROW_ID将子查询关联回主查询。因此,对于T1中的每一行,都会计算T2中匹配记录的计数。
你可以有不相关的子查询,例如
在这种情况下,结果集中的每条记录在COUNT_T2中将具有相同的值