2014-09-10 53 views
0

我有一個表有兩列(p_id,id_type),其中p_id可以有多個類型。我需要找到沒有特定類型的p_ids。這可以更有效地完成

P_ID     ID_TYPE 
-----------   ------------- 
12456      6 
12456      7 
56897      10 
25686      9 
25686      22 
25686      7 
56897      22 

這是我用過的查詢,但想知道是否有更有效的方法來做到這一點。

select p_id 
into #temp1 
from table2 
where id_type = 6 

SELECT 
distinct table2.p_id 
,table1.NAME 
,table1.TYPE 

FROM 
table2 left join table1 
on table2.p_id = table1.p_id 
where 
table2.p_id not in 
    (select p_id from #temp1) 
and type = 'XYZ' 

預期結果應該是不具有ID_TYPE = 6

P_ID   Name   Type 
56897  Smith   Physician 
25686  Jones   Physician 
+2

您可以添加預期的結果嗎? – Jens 2014-09-10 19:09:13

+0

你的代碼很好。你可以刪除臨時表的創建,並在你正在做的內部select中處理獲得帶有id_type = 6的p_ids,這是你已經在做的,但以更長的方式。 – SQLChao 2014-09-10 19:17:32

+0

你是什麼意思'我需要找到沒有特定類型的p_ids.'? – KrazzyNefarious 2014-09-10 19:19:08

回答

1

假設我正確理解你的問題的P_IDs,你要選擇所有的p_id行,唐沒有任何具有特定類型的相應p_id行。

如果是這樣,有幾種方法可以做到這一點。一種是使用NOT IN

select * 
from yourtable 
where p_id not in (
    select p_id 
    from yourtable 
    where id_type = 6) 

使用NOT EXISTS

select * 
from yourtable t 
where not exists (
    select 1 
    from yourtable t2 
    where t.p_id = t2.p_id and 
     t2.id_type = 6) 

您也可以使用OUTER JOIN來達到相同的結果。

如果您只想要特定的p_id,那麼您需要添加DISTINCT。目前還不清楚你的預期產出應該是什麼。

+0

+1排除單ID_TYPE這比數的情況下更好 – FuzzyTree 2014-09-10 19:21:57

0

更SQLy的方式來做到這一點是使用一個單一的左連接來找到所謂的Relative Complement。本質上我們想說的是「把所有的p_id,然後拿走所有有6」id_type「。

SELECT DISTINCT t.p_id 
FROM table2 AS t 
LEFT OUTER JOIN table2 AS t2 ON t.p_id = t2.p_id 
    AND t2.id_type = 6 
WHERE t2.p_id IS NULL