簡體   English   中英

SQL:子查詢中的多個內部聯接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM