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

y53ybaqx  于 2021-06-15  发布在  Mysql
关注(0)|答案(5)|浏览(267)


正在尝试生成select查询。
这是我的表,让我们调用第一列“id”,第二列“two”,第三列“three”,最后一列“date\u time”
我有这张table。我希望所有的行都等于7(在列'three'上),除非有一个条目等于8(在列'three'上)。
例如,我想要id为6而不是id为8的行(因为另一行输入了8)
我能够得到行,但是一旦有另一个8的条目存在,它就不会返回任何内容(使用not exists)
谢谢。

xxe27gdn

xxe27gdn1#

您可以使用self-join来获得结果

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的所有行,其中列'three'的值为7,然后它将为表b的列'three'赋值null,其中列'id'在表b的列'three'中找不到。

j2datikz

j2datikz2#

对您的需求的描述不是100%清楚,但是我认为您需要列3=7的那些行,但是除了那些列id存在于表的列3的其他地方的行之外。
这应该起作用:

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

cwxwcias3#

我们可以通过 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);

演示

这种方法可能会比反连接方法更好。

a5g8bdjr

a5g8bdjr4#

你可以用 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演示

aor9mmx1

aor9mmx15#

如果我正确理解你的问题,我相信下面的代码可以解决你的问题。

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

相关问题