Sql 这能更有效地做到吗

Sql 这能更有效地做到吗,sql,Sql,我有一个具有两列(p_id,id_type)的表,其中p_id可以有多种类型。我需要找到没有特定类型的p_ID P_ID ID_TYPE ----------- ------------- 12456 6 12456 7 56897 10 25686 9 25686

我有一个具有两列(p_id,id_type)的表,其中p_id可以有多种类型。我需要找到没有特定类型的p_ID

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类型=6的p_ID

P_ID         Name          Type
56897        Smith         Physician
25686        Jones         Physician

假设我正确理解了您的问题,您将尝试选择所有没有任何特定类型的对应p_id行的p_id行

如果是这样,有几种方法可以做到这一点。一种是使用
不在
中:

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

使用
不存在

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

您还可以使用
外部联接
来实现相同的结果


如果只需要特定的p_id,则需要添加
DISTINCT
。现在还不清楚您期望的输出应该是什么。

一种更简单的方法是使用一个左连接来查找一个名为。本质上我们想说的是“拿走所有
p\u id
,然后拿走所有
id\u类型为6的”


你能添加预期的结果吗?你的代码很好。你可以不用创建临时表,只需处理在你的内部选择中获取id_type=6的p_id,这是你已经在做的,但需要更长的时间。你所说的
是什么意思?我需要找到没有特定类型的p_id。
?预期结果应该是那些没有id_type=6的p_id。P_ID名称类型56897史密斯医师25686琼斯医师+1对于排除单个ID_类型,这比计数病例要好
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