Mysql 表内差异

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 =

我有一些这样的数据:

当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 = 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当然,如果您的结构不允许这样做,那么您可以安全地使用它。我只是讨厌对我的数据进行编码,因为你现在会受到这种任意的限制。