有人可以简化我们使用相关嵌套子查询的方式和原因吗?我了解嵌套查询,但似乎无法将相关嵌套查询的逻辑包裹住。
这里是一个例子。我有两个用于电影租借数据库的表。
表出租具有有关租借电影的信息。表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行。
如果有人可以简化逻辑。有人告诉我嵌套相关查询是正确的,但我的第一个查询不应该产生相同的结果和逻辑。如果是这样,结果为何不同?
提前感谢。
不同之处在于在renting
中没有行的客户。
它们不在您的in
列表中,因此它们不包含在第一个查询中。
对于第二个查询,没有行匹配。 。 。但是相关子查询仍然返回0
,因为保证没有group by
的聚合查询将返回一行。
在第二个查询中,您还要选择在租用表中有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