【问题标题】:SQL: multiple inner join in subquerySQL:子查询中的多个内连接
【发布时间】:2017-09-17 10:01:24
【问题描述】:

此查询未显示正确结果。它显示了所有的 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 

我对上面的查询做了同样的意思;这个查询显示正确的结果。 结果显示只购买products.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 

第一个查询有什么问题?

【问题讨论】:

  • EXISTS 检查您的子查询中是否有任何结果。您的子查询返回自至少一位客户购买了该 CategoryID 以来的记录,因此所有记录都通过了外部查询中的测试。看起来您正在尝试使用该 o.customerid = o.customerid 进行相关子查询,但这是无稽之谈。 o.customerid = o.customerid 总是正确的。相反,可能是:customer.customerid = o.customerid,因此您将外部查询客户表与内部查询的 o 表进行比较。
  • c.CUSTOMERID=o.CUSTOMERID 部分上的内联订单o 涵盖 customer.customerid = o.customerid 部分。所以结果是一样的。当我去掉 " and o.customerid = o.customerid" 部分时,结果是一样的。不过谢谢!

标签: sql oracle subquery inner-join exists


【解决方案1】:

正如 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

【讨论】:

  • 谢谢!有用。但是有什么方法可以让我使用 EXISTS 而不是 WHERE IN?
  • 我为我的第一个答案添加了另外 2 个解决方案,其中一个包括 EXISTS。不过我不推荐它,因为最简单的方法是完全没有子查询:)
  • 感谢您帮助我。这是我的第一个问题。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 2017-03-15
相关资源
最近更新 更多