简化相关嵌套子查询

问题描述 投票:0回答:2

有人可以简化我们使用相关嵌套子查询的方式和原因吗?我了解嵌套查询,但似乎无法将相关嵌套查询的逻辑包裹住。

这里是一个例子。我有两个用于电影租借数据库的表。

出租具有有关租借电影的信息。表Customers具有有关出租它的客户的信息。

这里是嵌套查询的内容:

SELECT *
FROM CUSTOMERS
WHERE CUSTOMER_ID IN
-- nested to find customers with less than 5 rentals
    (SELECT CUSTOMER_ID
    FROM RENTING
    GROUP BY CUSTOMER_ID
    HAVING COUNT(*) < 5) 

这将输出59行。

这里是相关的嵌套查询:

-- Select customers with less than 5 movie rentals
SELECT *
FROM CUSTOMERS as c
WHERE 5 >
    (SELECT count(*)
    FROM renting as r
    WHERE r.customer_id = C.CUSTOMER_ID);

这将输出66行。

如果有人可以简化逻辑。有人告诉我嵌套相关查询是正确的,但我的第一个查询不应该产生相同的结果和逻辑。如果是这样,结果为何不同?

提前感谢。

sql database postgresql correlated-subquery nested-queries
2个回答
1
投票

不同之处在于在renting中没有行的客户。

它们不在您的in列表中,因此它们不包含在第一个查询中。

对于第二个查询,没有行匹配。 。 。但是相关子查询仍然返回0,因为保证没有group by的聚合查询将返回一行。


1
投票

在第二个查询中,您还要选择在租用表中有0条记录的客户。

这是显示此行为的最小示例:

create table customers (customer_id int);
insert into customers values (1), (2), (3), (4);
create table renting (customer_id int);
insert into renting values (1), (1), (1), (1), (1), (1);
insert into renting values (2), (2), (2);
insert into renting values (3);

您的第一个子查询

SELECT CUSTOMER_ID
FROM RENTING
GROUP BY CUSTOMER_ID
HAVING COUNT(*) < 5

返回

 customer_id 
-------------
           3
           2
(2 rows)

在为每个客户评估第二个子查询返回值的同时,对于租用记录为0的客户,count(*)的评估值为0。例如:

select count(*) from renting where customer_id = 4;
 count 
-------
     0
(1 row)

因此,第二个查询包含客户2、3、4,而第一个查询仅包含客户2和3

© www.soinside.com 2019 - 2024. All rights reserved.