带有LEFT JOIN问题的SQL查询

时间:2013-05-18 13:41:32

标签: sql left-join

我遇到了左连接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"

当我运行查询时,即使我已经定义了Balance,我在'where子句'中得到错误'Unknown column'Balance'。

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

2 个答案:

答案 0 :(得分:3)

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

上的表达式
WHERE   COALESCE(b.totalCost , 0) - COALESCE(c.totalPayments , 0) > 0

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

您无法使用在ALIAS子句的同一级别上创建的WHERE的原因是因为WHERE子句首先执行SELECT子句所在的ALIAS子句{1}}已创建。

这是SQL操作顺序:

  • FROM clause
  • WHERE子句
  • GROUP BY子句
  • HAVING条款
  • SELECT条款
  • ORDER BY子句

答案 1 :(得分:2)

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

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

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