这可以更有效地完成

时间:2014-09-10 19:04:19

标签: sql

我有一个包含两列(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。

P_ID         Name          Type
56897        Smith         Physician
25686        Jones         Physician

2 个答案:

答案 0 :(得分:1)

假设我正确理解了您的问题,您尝试选择所有没有任何具有特定类型的相应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。目前尚不清楚你的预期输出应该是什么。

答案 1 :(得分:0)

更多SQLy方法是使用单个左连接来查找名为Relative Complement的内容。基本上我们想要说的是"拿走所有p_id,然后拿掉所有id_type为6"

的。{/ p>
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