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