【问题标题】:SQL Query with LEFT JOIN Issue带有 LEFT JOIN 问题的 SQL 查询
【发布时间】:2013-05-13 13:24:04
【问题描述】:

我在使用左连接 SQL 查询时遇到问题,但看不出它为什么不起作用。我有 3 个表:客户、购买和付款,我正在尝试选择总购买成本低于其总付款的客户(即他们的余额大于 0)。

到目前为止,我有以下内容:

表格:

Customers

id | Name


Purchases

id | customerid | cost


Payments

id | customerid | paymentamount 

SQL 查询:

SELECT  a.*, 
COALESCE(b.totalCost , 0) as totalCost, 
COALESCE(c.totalPayments , 0) as totalPayments, 
COALESCE(b.totalCost , 0) - COALESCE(c.totalPayments , 0) AS Balance 
FROM customers a 
LEFT JOIN (SELECT  customerid, SUM(cost) AS totalCost FROM purchases GROUP BY customer) b ON a.id = b.customerid 
LEFT JOIN (SELECT customerid, SUM(paymentamount) AS totalPayments FROM payments GROUP BY customerid) c ON a.id = c.customerid 
WHERE Balance > 0"

当我运行查询时,即使我已经定义了余额,我也会收到错误“‘where 子句’中的未知列‘余额’”。

非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: sql left-join


    【解决方案1】:

    因为BALANCE 是表达式上的别名。使用WHERE 子句上的表达式而不是ALIAS

    WHERE   COALESCE(b.totalCost , 0) - COALESCE(c.totalPayments , 0) > 0
    

    另一种方法是用子查询包装整个语句,这样您就可以在外部查询的WHERE 子句上使用别名。

    之所以不能使用在WHERE 子句的同一级别上创建的ALIAS 是因为WHERE 子句比创建ALIASSELECT 子句先执行。

    这是 SQL 的操作顺序:

    • FROM 子句
    • WHERE 子句
    • GROUP BY 子句
    • HAVING 子句
    • SELECT 子句
    • ORDER BY 子句

    【讨论】:

    • 不客气。 :) 如果您想将语句包装在子查询中,请参见 @a_horse_with_no_name 的答案 :)
    【解决方案2】:

    很遗憾,您不能在定义别名的同一“级别”上引用别名。

    您需要将所有内容包装到派生表中:

    select *
    from (
       <your query goes here>
    ) t
    where balance > 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      相关资源
      最近更新 更多