代码之家  ›  专栏  ›  技术社区  ›  Dawid

为什么我不能在子查询中使用表别名?

  •  0
  • Dawid  · 技术社区  · 2 年前

    我正在尝试运行以下查询:

    SELECT customers.id, customers.name, o.order_date
    FROM customers, 
        (SELECT id, 
         order_date 
         FROM orders ORDER BY order_date DESC) as o
    WHERE o.id = (
        SELECT id
        FROM o
        WHERE customer_id = customers.id
        LIMIT 1)
    ORDER BY customer_id;
    

    但是它会导致错误 relation "o" does not exist

    我知道上面的子查询的别名有问题,但我不知道该如何解决。我之所以不直接在WHERE子句中引用“orders”表,是因为我想通过创建一个只有2列排序的子查询来优化它,所以每次在WHERE子句中进行比较时,不会对整个表执行此查询(这是如何工作的?)。

    还有其他方法可以编写这个查询吗?

    2 回复  |  直到 2 年前
        1
  •  3
  •   Zegarek    2 年前

    这不是查询的唯一问题-您还引用了 customer_id 您没有选择的 orders 。一旦解决了这个问题并将子查询移动到 CTE ,它将起作用:

    with o as (
      SELECT 
        id, 
        customer_id,
        order_date 
      FROM orders 
      ORDER BY order_date DESC)
    SELECT 
      customers.id, 
      customers.name, 
      o.order_date
    FROM customers, 
         o
    WHERE o.id = (
        SELECT id
        FROM o
        WHERE o.customer_id = customers.id
        LIMIT 1)
    ORDER BY customer_id;
    

    Demo

    EDIT:

    当我加入这些表时,我只想加入基于日期的订单表中的第一个匹配项(最近的一个)

    MAX() 将足以获得客户及其最近的订单日期。

    SELECT 
      c.id, 
      c.name, 
      max(o.order_date) as most_recent_order_date
    FROM customers c 
      left join orders o 
      on o.customer_id=c.id
    group by c.id, c.name
    ORDER BY c.id;