0

我在使用 SQL Server 查询时遇到问题。我有几个表涉及[Order](我知道,没有很好地命名)和[Order Entry].

订单输入基本上是订单上的“行项目”(因此每个订单有一个或多个)。Order Entry 中有多个列,其中之一是ItemID(每个 Order Entry 只有一个ItemID)。我想要一个查询,它返回不包含一个或多个订单条目的所有行(订单),其中包含在列表中定义的 ItemID 列表。

这是我到目前为止所拥有的:

SELECT DISTINCT 
    oe.OrderID, StoreID
FROM 
    OrderEntry oe
INNER JOIN  
    [order] o ON o.ID = oe.OrderID 
              AND o.StoreID = oe.StoreID
              AND oe.ItemID NOT IN (60, 856, 857, 858, 902, 59, 240, 57, 217, 853, 855, 854, 41)

我想要做的似乎与此类似(如下),但我无法弄清楚: 选择所有包含多个项目的订单并检查所有项目状态

请帮忙!(非常感激)

4

5 回答 5

0

如果我对你的理解正确,你想要这样的东西。从 Orders 表开始查询并使用左连接将确保您获得所需的订单。通过左加入 ItemID 上的匹配项,您可以检查 where 语句中的空值,以查找没有这些行项目的订单。

select distinct o.OrderID, o.StoreID
from Orders o
left join OrderEntry oe on oe.OrderID = o.ID and oe.StoreID = o.StoreID
    and oe.ItemID in (60,856,857,858,902,59,240,57,217,853,855,854,41)
where oe.OrderID is null

因此,将其分解一下:

  • “select distinct... from Orders”的意思是“让我从订单中得到一切”

  • “left join OrderEntry on...”的意思是“给我所有满足这个条件的 OrderEntry 记录;如果没有记录满足条件,空值是可以的”

  • “其中 oe.OrderID 为空”表示“我只想查看 Orders 中左连接中没有匹配项的项目”

如果我们改用内部连接,我们就会丢失“nulls are OK”部分,因此 where 子句将不起作用。

于 2013-10-18T23:18:41.463 回答
0
 SELECT DISTINCT oe.OrderID, StoreID 
 FROM OrderEntry oe 
 WHERE NOT EXISTS (SELECT * 
                  FROM [order] o 
                  WHERE o.ID = oe.OrderID AND 
                       o.StoreID = oe.StoreID AND 
                       oe.ItemID IN ( 60,856,857,858,902,59,240,57,217,853,855,854,41 ))

这就是你所追求的吗?

于 2013-10-18T23:20:53.977 回答
0

尝试这个:

select OrderId, StoreId
from Order O
where o.orderId not in (select OrderId from 
    OrderEntry d where d.ItemId IN (10,6,7,5) )

问候

于 2013-10-19T01:59:01.693 回答
0
SELECT oe.OrderID, StoreID
FROM   OrderEntry oe
INNER  JOIN [order] o
ON     o.ID = oe.OrderID
AND    o.StoreID = oe.StoreID
GROUP BY oe.OrderID, StoreID
AND SUM (CASE WHEN oe.ItemID NOT IN ( 60,856,857,858,902,59,240,57,217,853,855,854,41 ) 
THEN 1 
ELSE 0
END) = 0
于 2013-10-19T02:26:48.013 回答
0

我能够从你们中的几个人那里拿走几件(米格尔·古兹曼 - 你提供了我需要的火花)并让它发挥作用。这是我的最终查询:

SELECT o.ID, o.StoreID
FROM [Order] o
JOIN PSD_ServiceTicket st
  ON o.ID = st.WorkOrderID
  AND o.StoreID = st.StoreID
WHERE o.StoreID = 101
AND o.Time >= '10/1/2013'
AND o.Time <= '10/18/2013'
AND o.ID NOT IN (SELECT OrderID
         FROM OrderEntry oe
         INNER JOIN [order] o
            ON o.ID = oe.OrderID
            AND o.StoreID = oe.StoreID
         WHERE oe.StoreID = 101
         AND o.Time >= '10/1/2013'
         AND o.Time <= '10/18/2013'
         AND oe.ItemID IN ( 60,856,857,858,902,59,240,57,217,853,855,854,41 )
        )
AND (st.ServiceTypeID = 1 OR st.ServiceTypeID = 4 )

谢谢大家!

于 2013-10-21T17:43:39.290 回答