在sql中根据列和两个条件选择不同的行

aelbi1ox  于 2021-06-24  发布在  Mysql
关注(0)|答案(4)|浏览(349)

我想从这个数据集中检索行,其中存在t1/t3值,但不存在对应id的t2/t3值。

ID  sample1 sample2 value
A_000002    T2  T3  -0.934119
A_000002    T1  T3  -0.866637
A_000029    T2  T3  -1.07677
A_000037    T2  T3  -0.76506
A_000057    T1  T3  -5.34988

我想说的是:

SELECT * FROM table
WHERE DISTINCT ID
AND sample_1 == "T1"
AND sample_2 == "T3"

…并仅返回以下内容,因为它没有对应于该id的t2/t3行:

A_000057    T1  T3  -5.34988

如果我使用sample_1和sample_2条件,我会得到不同的值,因为它会在检查id是否不同之前过滤掉“t2”值。
最近的一次是用可能的t1/t2/t3组合生成3个表,并筛选不存在的t1t2.id=t2t3.id

select * from T1T2
where not exists (select * from T2T3 where T2T3.id = T1T2.id)
and not exists (select * from T1T3 where T1T3._id = T1T2.id)
order by id

不过,我还不确定我是否相信代码。

cwxwcias

cwxwcias1#

我会用 not exists :

SELECT t.*
FROM table t
WHERE t.sample_1 = 'T1' AND t.sample_2 = 'T3' AND
      NOT EXISTS (SELECT 1 FROM table t2 WHERE t2.id = t.id);
h9a6wy2h

h9a6wy2h2#

你可以用 not exists :

select t.*
from table t
where (sample1 = 'T1' and sample2 = 'T3') and
       not exists (select 1 
                   from table t1 
                   where t1.id = t.id and 
                         t1.sample1 = 'T2' and t1.sample2 = 'T3'
                  );
qgelzfjb

qgelzfjb3#

这将是一个残酷的工作:
从表中选择distinct id,*其中sample1='t1'和sample2='t3'

v9tzhpje

v9tzhpje4#

可以基于外部联接使用此技术:

select t1.*
from table t1
left join table t2
on t2.id = t1.id
  and t2.sample1 = 'T2' and t2.sample2 = 'T3'
where t1.sample1 = 'T1' and t1.sample2 = 'T3'
and t2.id is null

它之所以有效,是因为如果没有连接,外部连接将返回null,而您只能通过 t2.id is null 中的条件 where 条款。
这种技术的最大优点是有效地使用 id 列;这项技术通常比其他方法更有效。另外,我觉得这是一个整洁的查询。
请注意 sample 列必须处于的联接条件中 t2 ,否则将有效地获得一个内部连接,从而破坏所需的外部连接。

相关问题