[英]SQL: multiple inner join in subquery
該查詢沒有顯示正確的結果。 它顯示所有CustomerId。
select Customers.customerid, Customers.custfirstname, Customers.custlastname from customers
where exists (select * from customers c
inner join orders o on c.CUSTOMERID=o.CUSTOMERID
inner join ORDER_DETAILS od on o.ordernumber = od.ORDERNUMBER
inner join products on products.PRODUCTNUMBER= od.PRODUCTNUMBER
where products.CATEGORYID= 2 and o.customerid = o.customerid);
以上結果是
CUSTOMERID CUSTFIRSTNAME CUSTLASTNAME
---------- ------------------------- -------------------------
1001 Suzanne Viescas
1002 William Thompson
1003 Gary Hallmark
1004 Robert Brown
1005 Dean McCrae
1006 John Viescas
1007 Mariya Sergienko
1008 Neil Patterson
1009 Andrew Cencini
1010 Angel Kennedy
1011 Alaina Hallmark
1012 Liz Keyser
1013 Rachel Patterson
1014 Sam Abolrous
1015 Darren Gehring
1016 Jim Wilson
1017 Manuela Seidel
1018 David Smith
1019 Zachary Ehrlich
1020 Joyce Bonnicksen
1021 Estella Pundt
1022 Caleb Viescas
1023 Julia Schnebly
1024 Mark Rosales
1025 Maria Patterson
1026 Kirk DeGrasse
1027 Luke Patterson
1028 Jeffrey Tirekicker
28 rows selected
我與上述查詢的含義相同;該查詢顯示正確的結果。 它顯示了僅購買產品的客戶的結果。CATEGORYID= 2
select distinct c.customerid, c.custfirstname, c.custlastname from customers c
inner join orders o on o.customerid=c.CUSTOMERID
inner join ORDER_DETAILS od on od.ORDERNUMBER=o.ORDERNUMBER
inner join products p on p.PRODUCTNUMBER=od.productnumber
where p.CATEGORYID= 2
order by 1;
正確的結果是
CUSTOMERID CUSTFIRSTNAME CUSTLASTNAME
---------- ------------------------- -------------------------
1002 William Thompson
1004 Robert Brown
1005 Dean McCrae
1006 John Viescas
1007 Mariya Sergienko
1008 Neil Patterson
1009 Andrew Cencini
1010 Angel Kennedy
1011 Alaina Hallmark
1012 Liz Keyser
1013 Rachel Patterson
1014 Sam Abolrous
1016 Jim Wilson
1017 Manuela Seidel
1018 David Smith
1019 Zachary Ehrlich
1020 Joyce Bonnicksen
1021 Estella Pundt
1023 Julia Schnebly
1024 Mark Rosales
1025 Maria Patterson
1026 Kirk DeGrasse
1027 Luke Patterson
23 rows selected
第一個查詢有什么問題?
正如JNevill指出的,如果子查詢中有任何結果,則EXISTS
將返回true。 如果將其更改為:
SELECT c.customerid, c.custfirstname, c.custlastname
FROM customers AS c
WHERE c.customerid IN ( SELECT [subquery here...]
WHERE products.CATEGORYID = 2)
您的子查詢不需要o.customerid = o.customerid
因為它看起來像是錯字,而不是o.customerid = c.customerid
並且在您的INNER JOIN
條件中已涉及到。
****編輯[現有版本] ****
SELECT c1.customerid,
c1.custfirstname,
c1.custlastname
FROM customers AS c1
WHERE EXISTS ( SELECT 1
FROM customers c2
INNER JOIN orders o ON c2.CUSTOMERID = o.CUSTOMERID
INNER JOIN ORDER_DETAILS od ON o.ordernumber = od.ORDERNUMBER
INNER JOIN products ON products.PRODUCTNUMBER = od.PRODUCTNUMBER
WHERE products.CATEGORYID = 2 AND c2.customerid = c.customerid )
最好的方法就是自己的子查詢:
SELECT c.customerid,
c.custfirstname,
c.custlastname
FROM customers AS c
INNER JOIN orders o ON c.CUSTOMERID = o.CUSTOMERID
INNER JOIN ORDER_DETAILS od ON o.ordernumber = od.ORDERNUMBER
INNER JOIN products ON products.PRODUCTNUMBER = od.PRODUCTNUMBER
WHERE products.CATEGORYID = 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.