2014-07-15 60 views
0

似乎無法使此SQL查詢生效!我已經搜索了這個答案,雖然有些帖子接近,但他們只是錯過了這個標記。查找列中未找到其他行的值的行

給定一個表,Table1,與Key1 (int), Key2 (int), and Type (varchar)列...

我想獲得其中 Type等於'TypeA'Key2行是Null 沒有相應的行中的表,其中 Type等於'TypeB'Key2等於Key1從另一行

所以,給出的數據

**KEY1**  **Key2**  **Type** 
    1   NULL   TypeA 
    2   5   TypeA 
    3   1   TypeB 
    4   NULL   TypeA 
    5   NULL   TypeB 

我想僅返回Key1 = 4的行,因爲該行符合Type ='TypeA'/ Key2 = NULL的條件,並且沒有Type ='TypeB'的對應行/ Key1 = Key2從另一行。

我已經試過這一點,它不工作...

SELECT t1.Key1, t1.Key2, t1.Type 
FROM Table1 t1 
WHERE t1.Key2 IS NULL 
    AND t1.Type LIKE 'TypeA' 
    AND t1.Key1 NOT IN 
     (SELECT Key1 
      FROM Table1 t2 
      WHERE t1.Key1 = t2.Key2 
       AND t1.Key1 <> t2.Key1 
       AND t2.Type LIKE 'TypeB') 
+0

如果你想「Type等於'TypeA'」,你會如何得到第三行? –

+0

困惑了一下,Gordon的評論需要回答,而這一個:「和Key2是NULL,表中沒有相應的行......」如果key2爲null,那麼它當然在key1中沒有對應的行,除非你有key1中有一個空值的行。 key1 = 3如何返回?它似乎違反了你的定義的每個組成部分。你可以編輯你的問題,並將該行改寫成更清楚的內容嗎? – Twelfth

+0

非常好的一點!我可以看到混淆的原因在於我詢問了Key1 = 3的行,而不是我真正想要的行,這是Key1 = 4的行。我編輯了這個問題,並對這個描述進行了修飾,並且一直在努力,並且一直希望不要添加更多的混淆。 – user1266896

回答

1

我不是其中的子查詢的最大的風扇。

select t1.Key1, t1.Key2, t1.Type 
from table1 t1 
left join table1 t2 
      on t1.key1 = t2.key2 
      and t2.type = 'typeb' 
where t1.type = 'typea' 
     and t1.key2 is null 
     and t2.key1 is null 

我認爲這裏的邏輯是正確的。我們正在採取表1,其中t1.key2爲空,並且t1.type ='typea'...將它連接到它自己作爲t2,其中t2.type ='typeb'。每當它找到一個t2.type b記錄時,我們想要省略它,所以在t2.key1(或任何t2字段)爲空的情況下。

邏輯有意義嗎?給它一個跑步,讓我知道

+0

由於數據量多,需要多一點測試,但似乎是一個很好的解決方案......感謝第十二個! – user1266896

相關問題