Sql 这能更有效地做到吗
我有一个具有两列(p_id,id_type)的表,其中p_id可以有多种类型。我需要找到没有特定类型的p_IDSql 这能更有效地做到吗,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
----------- -------------
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