我遇到了左连接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'。
非常感谢任何帮助。谢谢!
答案 0 :(得分:3)
因为BALANCE
是表达式上给出的ALIAS。使用WHERE
子句而不是ALIAS
WHERE COALESCE(b.totalCost , 0) - COALESCE(c.totalPayments , 0) > 0
另一种方法是使用子查询包装整个语句,以便可以在外部查询的WHERE
子句中使用别名。
您无法使用在ALIAS
子句的同一级别上创建的WHERE
的原因是因为WHERE
子句首先执行SELECT
子句所在的ALIAS
子句{1}}已创建。
这是SQL操作顺序:
答案 1 :(得分:2)
很遗憾,您无法在定义它的同一“级别”上引用别名。
您需要将所有内容都包装到派生表中:
select *
from (
<your query goes here>
) t
where balance > 0