Mysql 表内差异
我有一些这样的数据: 当VI和NUM相同时,我尝试只返回一个选择DATA=MONITO但不带DATA=SIGN的行Mysql 表内差异,mysql,sql,Mysql,Sql,我有一些这样的数据: 当VI和NUM相同时,我尝试只返回一个选择DATA=MONITO但不带DATA=SIGN的行 在本例中,只应返回第三行。我想您需要这样的内容: select t.* from table t where not exists (select 1 from table t2 where t2.subj_id = t.subj_id and t2.num =
在本例中,只应返回第三行。我想您需要这样的内容:
select t.*
from table t
where not exists (select 1
from table t2
where t2.subj_id = t.subj_id and
t2.num = t.num and
t2.data = 'MONITO'
);
您的问题不清楚哪些列实际用于排除第二行。我猜这是第一个和第三个。在任何情况下,“不存在”方法都应该适用于您实际需要的任何逻辑。试试这个
SELECT *
FROM TEST
WHERE VI*100 + NUM NOT IN
(SELECT VI*100 + NUM
FROM TEST
WHERE DATA ='SIGN')
AND DATA = 'MONITO';
QUIT;
Gordon的答案是正确的,但在编写时返回空集
Rubix关于解决方案依赖于数据的说法是正确的,但他的解决方案也会返回空集
SELECT *
FROM t
WHERE DATA="MONITO"
AND "SIGN" NOT IN (SELECT DATA FROM t as t2 WHERE t2.VI = t.VI AND t2.Num = t.num)
这是一个不依赖数据的解决方案:
proc sql;
select * from test
except
select distinct d.*
from test as d
inner join
(select a.vi, a.num from (select * from test where data = 'SIGN') as a
inner join
test as b
on a.vi = b.vi
and a.num=b.num)as c
on d.vi = c.vi
and d.num = c.num;
quit;
选择*from table where DATA='MONITO'和VI=vumt这将不起作用,我想要DATA=MONITO的行,前提是在同一个表中没有具有相同VI和NUM以及DATA=signisting解决方案的行,但我不喜欢它依赖于数据。在VI*100+NUM等于同一个数的情况下,VI和NUM的多个组合是可行的。示例:VI=1num=1vi=0num=101当然,如果您的结构不允许这样做,那么您可以安全地使用它。我只是讨厌对我的数据进行编码,因为你现在会受到这种任意的限制。