2013-10-18 17 views
0

我遇到SQL Server查詢問題。我有幾個表涉及到[Order](我知道,不是很好)和[Order Entry]選擇包含多個訂單項的訂單,但在一個或多個訂單項包含已定義列表時不能選擇

訂單錄入基本上是訂單上的「訂單項」(因此每個訂單有一個或多個訂單)。訂單分錄中有各種欄目,其中之一是ItemID(每個訂單分錄只有一個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) 

我想似乎與此類似(見下文),但我無法弄清楚: SELECT all orders with more than one item and check all items status

請幫助! (非常感謝)

+0

我懷疑訂單和訂單分錄表是否共享主外鍵關係,所以如果沒有訂單,就不可能有訂單分錄,所以如果有訂單,那麼至少應該有訂單輸入。 –

回答

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) 

感謝大家!

0

如果我正確理解你,你需要這樣的東西。使用訂單表開始查詢並使用左連接將確保您獲得您要查找的訂單。通過在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 

因此,要打破這一點:「從訂單選擇不同的......」

  • 的意思是「讓我一切從訂單」

  • 「左聯接訂單條目上。 ..「的意思是」給我所有滿足這個標準的OrderEntry記錄;如果沒有記錄符合標準,則空值是OK「

  • 」where oe.OrderID is null「意思是」我只想要E在訂單的已在左邊沒有匹配的項目加入」

如果我們使用內部聯接,而不是,我們就失去了那種‘空都OK’的一部分,所以在where子句不會工作。

+0

這導致沒有匹配的記錄 – bdizz

+0

我在我的數據庫中的一組類似的表上運行了這個查詢的一個版本,並且它按照我的預期工作。您確定您的記錄符合條件(沒有包含您的ItemID列表之一的條目)?或者我誤解了你最初的問題? –

+0

我想也許我沒有解釋得很好,因爲這不適合我,但我終於能夠解決。感謝您的幫助! – bdizz

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)) 

這是你之後?

+0

這是我得到的結果,我已經有了...我得到所有相同的OrderID返回(其中一些包含oe.ItemID在「NOT IN」列表中) – bdizz

+0

我編輯了查詢。這是否解決了這個問題? – jcwrequests

+0

即使進行了編輯,也沒有幫助。請參閱下面我的[現在]工作解決方案... – bdizz

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)) 

問候

+0

這個想法讓我朝着正確的方向前進 - 謝謝! – bdizz

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 
+0

看來這是朝着正確的方向發展。有一個錯誤「關鍵字附近的語法不正確」和'。「(我認爲這裏沒有WHERE子句,而是一個AND子句,但我認爲我不明白)。 – bdizz

+0

下面是我有的完整代碼:'SELECT DISTINCT oe.OrderID AS OrderNumber FROM orderEntry oe JOIN PSD_ServiceTicket st ON oe.OrderID = st.WorkOrderID AND oe.StoreID = st.StoreID WHERE EXISTS(SELECT o.ID FROM [order] o WHERE o.ID = oe.OrderID和o.StoreID = oe.StoreID和o.Time> = '10/1/2013'和o.Time <= '10/17/2013'並且oe.ItemID不在(60,856,857,858,902 ,59,240,57,217,853,855,854,41)和o.StoreID = 101)AND(st.ServiceTypeID = 1或st.ServiceTypeID = 4)' – bdizz