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

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


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

iqjalb3h

iqjalb3h1#

我们可以通过 EXISTS 查询:

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

演示

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

rqdpfwrv

rqdpfwrv2#

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

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

在上面的查询中,它将获得表a的所有行,其中列'three'的值为7,然后它将为表b的列'three'赋值null,其中列'id'在表b的列'three'中找不到。

li9yvcax

li9yvcax3#

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

  1. SELECT
  2. `id`, `two`, `three`, `date_time`
  3. FROM
  4. `yourtable`
  5. WHERE
  6. `three` = 7
  7. AND `id` NOT IN (SELECT `three` FROM `yourtable`)
crcmnpdw

crcmnpdw4#

你可以用 exists 作为

  1. select *
  2. from tab t1
  3. where t1.three = 7
  4. and exists ( select 1 from tab t2 where t2.id = t1.id and t1.id != 8 );
  5. id two three date_time
  6. --- ---- ----- -------------------
  7. 6 4 7 2018-12-17 16:56:41

rextester演示

6kkfgxo0

6kkfgxo05#

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

  1. SELECT
  2. A.ID, A.TWO, A.THREE, A.DATE_TIME
  3. FROM
  4. TABLE A
  5. LEFT JOIN
  6. TABLE B ON A.TWO=B.TWO AND B.THREE=8 AND A.ID<>B.ID
  7. WHERE
  8. B.ID IS NULL
  9. AND A.THREE=7

相关问题