【问题标题】:Simplifying Correlated Nested Subqueries简化相关嵌套子查询
【发布时间】:2020-05-11 16:21:00
【问题描述】:

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

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

Renting 表包含有关租借电影的信息。 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


    【解决方案1】:

    区别在于renting中没有行的客户。

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

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

    【讨论】:

      【解决方案2】:

      在第二个查询中,您还选择了在租用表中有 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-01
        • 1970-01-01
        • 2019-03-05
        • 1970-01-01
        相关资源
        最近更新 更多