2016-07-22 43 views
2

加入三個表場景... STORE獲取LIST。 'LIST'基本上是需要計數的商店庫存SKU的集合。如何使用NOT IN CLAUSE

當商店從指定給它的給定List開始計數SKU時,信息被保存在另一個名爲'StoreCycles'的表中,該表記錄了ListId,StoreName和計數開始和完成的日期。

這些是我的表格。

表1中。表與「詞典」,其具有一個主鍵「ListId」

ListId ListName 
    1  abc 
    2  def 
    3  ghi 

表2「商店」 - 從上面的表中的每個列表(「列表」表)被分配給一個或多個商店。 「商店」表中的ListId是「列表」表格的主鍵。 Listid和LineId一起組成外鍵。

ListId LineId StoreName 
    1  1 StoreA 
    1  2 StoreD 
    2  1 StoreB 
    2  2 StoreC 
    2  3 StoreA 
    3  1 StoreA 

表3.'StoreCycles' - 當分配給商店的列表開始計數並完成時,它會保存。

ListId StoreName StartDate CompleteDate 
    1  StoreA 2016-7-22 2016-7-22 
    2  StoreA 2016-7-22 
    2  StoreC 2016-7-22 

在任何時候我想拉起那些尚未完成的名單,即他們有一個空的完整日期。

這是我的查詢:

Select T0.ListId, 
T0.ListNaame , 
T2.StartDate 
From Lists T0 
JOIN Stores T1 On T0.ListId = T1.ListId 
LEFT JOIN StoreCycles T2 ON T0.ListId = T2.ListId 
WHERE T1.StoreName = 'StoreA' 
AND T0.ListId NOT IN (SELECT ListId FROM StoreCycles WHERE CompleteDate IS NOT NULL) 

結果應該是>>

ListId ListName StartDate 
    2  def  2016-7-22 
    3  ghi  NULL 

但我得到的是這種

ListId ListName StartDate 
2  def  NULL 
2  def  NULL 
3  ghi  NULL 
+0

你在結果集中有字段'ListName'作爲整數,但是你的數據顯示字段是'abc'。請更正您的問題,以顯示您想查詢的結果:「LineId」或「ListName」 – Tony

+1

我試過了您的查詢,它給出了應該的結果。至少如果CompleteDate是日期字段。你能否檢查一下,如果CompleteDate不是一些帶空格的varchar,那裏應該是null的? – LukStorms

+0

我也試過了你的查詢(http://sqlfiddle.com/#!9/913ce/2),它給出的結果與你所期望的相似 - 雖然列表_name_與你在例子中給出的_id不同。 – Tony

回答

1

只是路過,並轉儲SQL。

繼續,沒什麼可看的。

這裏沒有找尋錯誤。

declare @Lists table (ListId int primary key, ListName varchar(20)); 
insert into @lists values (1,'abc'),(2,'def'),(3,'ghi'); 

declare @Stores table (ListId int, LineId int, StoreName varchar(20)); 
insert into @Stores values 
(1,1,'StoreA'), 
(1,2,'StoreD'), 
(2,1,'StoreB'), 
(2,2,'StoreC'), 
(2,3,'StoreA'), 
(3,1,'StoreA'); 

declare @StoreCycles table (ListId int, StoreName varchar(20), StartDate date, CompleteDate date); 
insert into @StoreCycles values 
(1,'StoreA','2016-7-22','2016-7-22'), 
(2,'StoreA','2016-7-22',null), 
(2,'StoreC','2016-7-22',null); 

SELECT 
L.ListId, 
L.ListName, 
SC.StartDate 
FROM @Stores S 
JOIN @Lists L On (S.ListId = L.ListId) 
LEFT JOIN @StoreCycles SC ON (S.ListId = SC.ListId AND S.StoreName = SC.StoreName) 
WHERE S.StoreName = 'StoreA' 
AND SC.CompleteDate IS NULL; 
+0

如果您發現結果檢索ListId引用ListId'2'它被分配給的兩個條目,我已編輯您的小提琴在這裏[鏈接](http://sqlfiddle.com/#!9/ddf001/1)都StoreA和StoreC。我只想拉一個特定的商店的結果。 – Harrobbed

+0

這次我將Storename添加到第二次加入。獲取預期的結果。 – LukStorms

+0

非常感謝你。我真的需要磨練我的SQL技能。感謝所有花時間幫助我的人,即使我沒有正確地設定問題,這是第一次。 – Harrobbed

0

也許另一種方式來看待它的結果將返回StartDate爲NULL(無記錄)或CompleteDate爲NULL(NULL)的所有行不完整的記錄)。另外,如果外鍵使用2列,則可能需要在JOIN中使用兩列。

SELECT T0.ListId, 
     T0.ListName, 
     T2.StartDate 
FROM Lists T0 
      JOIN Stores T1 
       ON T1.ListId = T0.ListId 
      LEFT JOIN StoreCycles T2 
       ON T2.ListId = T1.ListId 
       AND T2.LineId = T1.LineId 
WHERE T1.StoreName = 'StoreA' 
AND (T2.CompleteDate IS NULL OR T2.StartDate IS NULL) 
0
Select 
    l.ListId 
    ,l.ListNaame 
    ,sc.StartDate 
From 
    Lists l 
    JOIN Stores s 
    ON l.ListId = s.ListId 
    AND s.StoreName = 'StoreA' 
     LEFT JOIN StoreCycles sc 
     ON s.ListId = sc.ListId 
     AND s.LineId = sc.LineId 
WHERE 
     sc.CompleteDate IS NULL 

你已經在做連接,如果你正確地建立他們,你將不需要選擇或不在您的where子句。你的StoreCycles的關係似乎是錯誤的,因爲你試圖從Lists直接去StoreCyclesStores是中間表。

還只是一個想法,爲什麼不使用表的別名,這將有助於你知道你是指什麼表,而不是T0,T1,T2,如L,S,SC ....