选择不存在于具有多个字段的同一个表中
Posted
技术标签:
【中文标题】选择不存在于具有多个字段的同一个表中【英文标题】:Select with not exist in the same table with multiple fields 【发布时间】:2020-03-30 10:40:49 【问题描述】:我需要从同一个表中不存在的表中选择寄存器。我的意思是如果我有这张桌子:
ID VALUE1 VALUE2 VALUE3
1 1 1 1
2 2 2 1
3 3 4 1
4 1 5 1
5 2 2 2
6 3 4 2
7 1 8 2
8 2 2 2
查询的结果应该是
ID VALUE1 VALUE2 VALUE3
1 1 1 1
4 1 5 1
因为 value1 和 value2 的其余值相同,但 value3 不同。我的意思是表的第 2 行与第 5 行相同。
我尝试做类似但不起作用的事情:
select t1.value1, t1.value2 from table1 t1 where value3=1
and not exist
(select t2.value1, t2.value2 from table2 t2
where t1.value1=t2.value1 and t1.value2=t2.value2 and value3=2)
谢谢你的建议,对不起我的英语
【问题讨论】:
【参考方案1】:您可以按如下方式使用NOT EXISTS
:
SELECT *
FROM YOUR_TABLE T1
WHERE T1.VALUE3 = 1
AND NOT EXISTS
(SELECT 1
FROM YOUR_TABLE T2
WHERE T1.VALUE1 = T2.VALUE1
AND T1.VALUE2 = T2.VALUE2)
【讨论】:
像魅力一样工作,我知道不存在是关键,但我以错误的方式使用它:(【参考方案2】:我认为not exists
可以满足您的需求:
select t1.*
from table1 t1
where t1.value3 = 1 and
not exist (select 1
from table2 t2
where t2.value1 = t1.value1 and
t2.value2 = t1.value2 and
t2.value3 = 2
);
也就是说,你也可以使用窗口函数:
select t1.*
from (select t1.*,
max(value3) over (partition by value1, value2) as max_value3
from table1 t1
where value3 in (1, 2)
) t1
where max_value3 = 1;
【讨论】:
【参考方案3】:我认为您与exists
走在正确的轨道上。
我会将您的查询表述为:
select t1.*
from table1 t1
where
t1.value3 = 1
and not exist (
select 1 from table1 t2
where t1.value1 = t2.value1 and t1.value2 = t2.value2 and t2.value3 = 2
)
关键点:
exists
子查询应该是from table1
(您的查询使用table2
,但看起来这个表实际上并不存在)
您实际上不需要从 exists
子查询返回列,因为它所做的只是检查是否生成了 某些行 - 因此 select 1
【讨论】:
以上是关于选择不存在于具有多个字段的同一个表中的主要内容,如果未能解决你的问题,请参考以下文章