2013-06-29 54 views
2

過度簡化,但我需要幫助。比方說,我有這樣的SQL語句:SQL - 如果包含這些其他記錄,則包含此記錄

SELECT * FROM Policy p 
JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
WHERE OtherPolicyFile.Status IN (9,10) 

好的,這裏是故事。我還需要在狀態= 11的情況下抽取任何OtherPolicyFile,但是隻有當狀態爲9或10的匹配的OtherPolicyFile也是如此。

換句話說,通常我不會拉的OtherPolicyFile與狀態11,但如果政策也有一個OtherPolicyFile與狀態9或10,那麼我還需要拉任何OtherPolicyFiles與11

狀態

寫這個可能有一個非常簡單的方法,但我現在很疲憊,而且沒有跳過籃球就沒有到我這裏來。任何幫助,將不勝感激。

+0

所以基本上,如果9和10同時存在,那麼你試圖獲得狀態11? –

+0

@RaduGheorghiu我認爲如果9或10存在,他需要11,對吧託德? – TMS

+0

托馬斯是正確的 –

回答

3

執行一個額外的左連接和測試左邊的連接表爲NULL:

SELECT p.*, o.* 
FROM Policy p 
    JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
    LEFT JOIN OtherPolicyFile o9or10 
     on o9or10.PolicyId = p.PolicyId and o9or10.Status IN (9,10) 
WHERE o.Status IN (9,10) 
    OR o.Status = 11 AND o9or10.PolicyId is NOT NULL 
GROUP BY <whatever key you need> 

但是當心 - 你需要使用GROUP BY,以便增加的LEFT JOIN沒有按」重複的行。我不能建議適當的密鑰,因爲我不知道你的模式,所以請填寫適當的密鑰(可能是OtherPolicyFile的主ID,所以你的情況就像o.ID那樣?但我真的不知道)

+0

謝謝。我知道必須有某種相當簡單的方法,我想不起來。我的腦海不停地將所有東西都讀入臨時表中,然後通過重新選擇,這看起來效率低下且過度殺傷。感謝您的努力。 –

+0

你好@Todd。是的,大部分時間你都可以通過簡單的JOIN獲得。只是巧妙地將它們結合起來 – TMS

+0

@Tomas檢查我的答案。完成沒有連接,真的很好 –

2

我會添加一個子查詢來查看是否存在9或10。這裏的小提琴:http://sqlfiddle.com/#!3/1a68c/2

SELECT * FROM Policy p 
JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
WHERE o.Status IN (9,10) 
OR (o.Status = 11 AND 
    exists (select * from OtherPolicyFile innerO 
       where innerO.PolicyId = p.PolicyId 
       and (innerO.Status = 9 or innerO.Status=10))) 
+0

這是一個很好的答案,而且非常穩固。謝謝。我選擇其他回覆的唯一原因是因爲它看起來更有效率,並且添加到我的「真實」代碼時,不那麼複雜。 –

2

I相信這會帶來最好的表現。請注意沒有連接。

只會執行SQL Server上2005+

要知道,你不能「SELECT *」,並有兩個表這在相同的列名的工作。所以你必須指定你需要的列。

SELECT * from 
(
    SELECT <your columns>, 
    statuscheck = min(nullif(o.status, 11)) over (partition by o.PolicyId) 
    FROM Policy p 
    JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
    WHERE o.Status IN (9,10,11) 
) a 
WHERE statuscheck is not null 
+0

沒有連接???那麼「JOIN」在那裏呢? – TMS

+0

順便說一下,子查詢比連接效率低得多,因爲它們大多數都是臨時表。 – TMS

+0

@Tomas我沒有額外的連接,這個子查詢比你的左連接更有效。它基本上選擇所有具有9,10,11的行並拒絕那些沒有9和10的「分區」 –

相關問題