2013-01-03 52 views
4

我有3个表:SQL加入只有当所有记录都匹配

  • CP_carthead(idOrder)
  • CP_cartrows(idOrder,idCartRow)
  • CP_shipping(idCartRow,idShipping,dateShipped)

每个idOrder可以有多个idCartRows。

我想获得所有订单,其中全部它的idCartRows存在于CP_shipping中。这看起来应该很简单,但我在网上找不到太多。

这里是我的查询现在:

SELECT 
    s.idOrder 
    , s.LatestDateShipped 
FROM 
    CP_carthead o 
    LEFT OUTER JOIN (
         SELECT 
          MAX(s.dateShipped) [LatestDateShipped] 
          , r.idOrder 
         FROM 
          CP_shipping s 
          LEFT OUTER JOIN CP_cartrows r ON s.idCartRow = r.idCartRow 
         GROUP BY 
          r.idOrder    
        ) s ON o.idOrder = s.idOrder 
+0

从查看查询为什么不使用子查询并删除外部?并将'left join'改为'CP_cartrows'为'inner join' – Magnus

回答

2

您的查询从“S”行返回,而不是命令。根据你的问题,我想出了这个查询:

select o.* 
from CP_Carthead o 
where o.orderId in (select cr.idOrder 
        from cp_cartrows cr left outer join 
         cp_shipping s 
         on cr.idCartRow = s.IdCartrow 
        group by cr.idOrder 
        having count(s.idCartRow) = COUNT(*) 
        ) 

in语句中的子查询接到命令其所有cartrows都在出货。

+0

他只从加入的子查询中选择值,只有你的'CP_Carthead' – Magnus

+0

@Magnus。 。 。我知道。我正在回答这个问题(“我想获得订单......”),而不是复制查询。 –

+0

这对我有用。我的查询现在看起来是一样的 - 我刚刚添加了where子句。有没有更好的方法来实现这种方法? – Rivka

相关问题