SQL从表中获取行,除非存在值

时间:2018-12-18 10:38:22

标签: mysql sql mariadb

enter image description here

尝试建立选择查询。

这是我的表,我们将第一列称为“ id”,第二列称为“ two”,第三列称为“三”,最后一列称为“ date_time”

我有这张桌子。我要获得所有等于7(在“三”列上)的行,除非存在等于8(在“三”列上)的条目。

例如,我想要ID为6但非ID为8的行(因为另一行输入了8)

我能够获得这些行,但是一旦另一个具有8的条目存在,它根本不会返回任何内容(使用不存在)

谢谢。

5 个答案:

答案 0 :(得分:1)

我们可以通过EXISTS查询来做到这一点:

SELECT id, two, three, date_time
FROM yourTable t1
WHERE three = 7 AND NOT EXISTS (SELECT 1 FROM yourTable t2 WHERE t2.three = t1.id);

enter image description here

Demo

这种方法可能胜过反联接。

答案 1 :(得分:1)

您可以使用自我加入来获得结果

select A.* from table_name A left join table_name B on A.id = B.three 
where A.three = 7 and B.three is null;

在上面的查询中,它将从表A中获得所有行,其中列“三”的值为7,然后将空值分配给表B的列“三”,其中在表“列”中未找到A表的列“ id” B表的三个”。

答案 2 :(得分:0)

The description of your requirement is not 100% clear, but I think you want to ask for those rows where column three = 7, but except for those rows where the ID of that row exists elsewhere in column three of the table.

This should work:

SELECT 
  `id`, `two`, `three`, `date_time`
FROM 
  `yourtable`
WHERE 
  `three` = 7
  AND `id` NOT IN (SELECT `three` FROM `yourtable`)

答案 3 :(得分:0)

如果我正确理解了您的问题,我相信以下代码将解决您的问题。

SELECT 
  A.ID, A.TWO, A.THREE, A.DATE_TIME 
FROM 
  TABLE A
LEFT JOIN 
  TABLE B ON A.TWO=B.TWO AND B.THREE=8 AND A.ID<>B.ID
WHERE 
   B.ID IS NULL
   AND A.THREE=7

答案 4 :(得分:0)

您可以将exists用作

   select *
     from tab t1
    where t1.three = 7
      and exists ( select 1 from tab t2 where t2.id = t1.id and t1.id != 8 );

   id   two  three date_time
   ---  ---- ----- -------------------
    6    4     7   2018-12-17 16:56:41

Rextester Demo