2014-04-14 41 views
1

我很難搞清楚如何提出這個問題,所以我直接轉到示例代碼。比方說,我有這些表:與一對多關係不存在的地方

create table Item 
(
    ItemId int identity(1,1), 
    Name nvarchar(256) 
) 

create table ItemSale 
(
    ItemSaleId int identity(1,1), 
    ItemId int, 
    Price decimal, 
    CategoryId tinyint 
) 

我想檢索是ItemSale記錄是不是在給定的CategoryId列表。至少對我而言,併發症是如果對於給定的ItemItemSale中存在記錄,我不希望看到有關該Item的任何記錄。

所以,如果我有這樣的數據:

insert into Item(Name) 
select N'Widget' union all 
select N'Foo' union all 
select N'Buzz' 

insert into ItemSale(ItemId, Price, CategoryId) 
select 1, 9.95, 1 union all 
select 1, 19.95, 2 union all 
select 3, 99.99, 3 

而且CategoryId我想篩選出爲1,那麼我不希望看到任何記錄ItemId 1(「窗口小部件」)。所以,用樣本數據,我只看到了ItemSale記錄Item ID爲3

我知道,我的解決方案很可能會涉及到某種NOT EXISTS OR LEFT JOIN但我與如何過濾掉所有的掙扎記錄而不僅僅是符合我的標準的特定記錄。我錯過了什麼?

SQLFiddle:http://sqlfiddle.com/#!3/79c58

+0

如果類標識符是已在ItemSale,你不能找到一個項目(在項目表上)不在一個類別中,也不在ItemSale表中。您可以做的是查找不在ItemSale中的項目(在項目表上)。那是你要的嗎? –

+0

@VitorTyburski我想找到ItemSale中沒有特定CategoryId記錄的項目,這有意義嗎? –

+0

是的,並且@GarethD的回答是正確的。 –

回答

3

我可能是在簡化你的問題,但我認爲這會工作:

SELECT * 
FROM ItemSale i 
WHERE NOT EXISTS 
     ( SELECT 1 
      FROM ItemSale i2 
      WHERE i.ItemID = i2.ItemID 
      AND  i2.CategoryID = 1 
     ); 

Example on SQL Fiddle

+0

事實證明,你並沒有將事物簡單化,因爲這似乎很有效。 –