2016-10-14 1 views
0

Я знаю, что подобные вопросы были заданы раньше, но я не видел их более чем для двух таблиц. И, похоже, есть разница.SQL EXISTS возвращает все строки, более двух таблиц

У меня есть три таблицы, из которых мне нужно поле, customers где мне нужно customerID и orderID из, orders из которого я получаю customerID и orderID и lineitems, из которого я получаю orderID и quantity (= количество заказанного).

Я хочу, чтобы узнать, сколько клиентов купили более чем в 2 раза одного и того же элемента, так что в основном количество> 2 с:

SELECT COUNT(DISTINCT custID) 
FROM customers 
WHERE EXISTS(
    SELECT * 
    FROM customers C, orders O, lineitems L 
    WHERE C.custID = O.custID AND O.orderID = L.orderID AND L.quantity > 2 
    ); 

Я не понимаю, почему она возвращается мне количество всех строк. Я сопоставляю подзапросы перед проверкой состояния> 2, не так ли?

Я новичок в SQL, поэтому я был бы благодарен, если бы вы могли объяснить это мне в корне, если это необходимо. Благодарю.

ответ

2

Вам не обязательно повторять customers таблицу в подзапросе EXISTS. Это идея корреляции: используйте таблицу внешнего запроса для корреляции.

SELECT COUNT(DISTINCT custID) 
FROM customers c 
WHERE EXISTS(
    SELECT * 
    FROM orders O 
    JOIN lineitems L ON O.orderID = L.orderID 
    WHERE C.custID = O.custID AND L.quantity > 2 
    ); 
+0

Таким образом, ошибка вызвана повторением клиентов снова? Или используется 'JOIN' вместо' FROM ... WHERE ... 'также имеет значение при использовании нескольких таблиц? – sandboxj

+1

@sandboxj Да, ошибка связана с тем, что таблицы «клиенты» используются снова: она превосходит идею корреляции. Также предпочтительнее использовать современный синтаксис JOIN, как в предыдущем запросе, вместо синтаксиса старого стиля с разделенными запятыми таблицами. –

1

Я хотел бы подойти к этому, как два агрегатов:

select count(distinct customerid) 
from (select o.customerid, l.itemid, count(*) as cnt 
     from lineitems li join 
      orders o 
      on o.orderID = l.orderId 
     group by o.customerid, l.itemid 
    ) ol 
where cnt >= 2; 

Внутренний запрос подсчитывает количество элементов, каждый клиент купил. Внешние подсчитывают количество клиентов.

EDIT:

я, возможно, неправильно понял вопрос для ответа на данный вопрос. Если вы просто хотите, где quantity >= 2, то, что гораздо проще:

select count(distinct o.customerid) 
from lineitems li join 
    orders o 
    on o.orderID = l.orderId 
where l.quantity >= 2; 

Это, вероятно, самый простой способ выразить запрос.

0

Я предлагаю вам использовать "присоединяется",

Попробуйте

выберите COUNT (*) От заказов уплотнительные внутреннее соединение lineitems л на l.orderID = o.orderID где l.quantity> 2

Смежные вопросы