2013-05-18 4 views
1

У меня возникают проблемы с левым SQL-запросом на соединение, но я не вижу, почему он не работает. У меня есть 3 таблицы: клиенты, покупки и платежи, и я пытаюсь выбрать клиентов, общая стоимость покупок которых меньше их общих платежей (т. Е. У них баланс больше 0).SQL-запрос с LEFT JOIN Проблема

До сих пор у меня есть следующие:

Таблицы:

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" 

При запуске запроса, я получаю ошибку 'Неизвестный столбец' Баланс 'in' where clause '', хотя я определил Balance.

Любая помощь очень ценится. Благодаря!

ответ

3

потому что BALANCE является ALIAS дано на выражение. Используйте выражение в пункте WHERE вместо ALIAS

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

другой путь, чтобы обернуть все заявление с подзапроса, так что вы можете использовать псевдоним на предложении внешнего запроса WHERE.

Причина, почему вы не можете использовать ALIAS, который создается на том же уровне пункта WHERE потому, что WHERE условие выполняется первым, чем п SELECT где ALIAS создается.

Вот SQL Порядок работы:

  • ЕКОМ
  • ИНЕКЕ
  • GROUP BY п
  • предложения HAVING
  • ВЫБРАТЬ пункт
  • ORDER BY п
+0

Спасибо за помощь !! – mckeegan375

+0

добро пожаловать. ':)', если вы хотите поместить инструкцию в подзапрос, см. также ответ @a_horse_with_no_name ':) ' –

2

К сожалению, вы не можете ссылаться на псевдоним на том же «уровне», где он определен.

Вам нужно обернуть все в производной таблице:

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