选择不存在于具有多个字段的同一个表中

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

【讨论】:

以上是关于选择不存在于具有多个字段的同一个表中的主要内容,如果未能解决你的问题,请参考以下文章

SQLite查询选择另一个表中不存在的所有记录

删除一个表中存在而另一个表中不存在的数据?

选择另一个表中不存在的值

从一个表中选择 Laravel 5.1 中另一个表中不存在的所有记录

定义表中不存在时删除 jsonb 键

如果访问中不存在则插入