在一个表中查找另一个表中不存在的值

时间:2019-11-25 16:34:42

标签: sql sql-server

我正在尝试查找一个实例,其中学生在名为SMO的表中具有带有XXX后缀的模块,但是只要在称为MAV的表中存在非XXX变体,就不存在非XXX变体。

SPR_CODE - MOD_CODE
 1. 1234 - AA101XXX
 2. 5678 - AA101XXX
 3. 5678 - AA101

应返回:

SPR_CODE - MOD_CODE
 1. 1234 - AA101XXX

真正重要的主键(我认为)是学生代码(spr_code),学年(ayr_code)和模块代码(mod_code)

目前,我似乎还无法弄清楚该怎么做,但我可能只是想得太多。我尝试从SMO开始并从那里开始,但是我无法使其正常工作:

select
sm1.spr_code
,sm1.mod_code
,sm2.mod_code

from
cam_smo sm1
left join cam_smo sm2 on ((substring(sm1.mod_code,1,charindex('XXX',sm1.mod_code)-1) = sm2.mod_code) and (sm1.spr_code = sm2.spr_code))

where
sm1.mod_code like '%XXX'
and sm1.ayr_code = '2019/0'

我还没有抛出MAV表,因为我只是想查找具有XXX后缀模块而没有非XXX后缀模块的学生实例,那么我将确保非XXX模块位于行下的MAV表中。我已经有一段时间没有写SQL了,我非常累,所以我可能很愚蠢,但是我认为左连接会显示存在的所有sm1.spr_code / sm1.mod_code实例,然后在sm2列上返回null .mod_code,但不是...

2 个答案:

答案 0 :(得分:1)

对我来说,这听起来像existsnot exists

select smo.*
from smo
where smo.mod_code like '%XXX' and
      not exists (select 1
                  from smo smo2
                  where smo2.spr_code = smo.spr_code and
                        smo2.mod_code + 'XXX' = smo.mod_code
                 ) and
      exists (select 1
              from mav
              where mav.mod_code + 'XXX' = smo.mod_code
             );

答案 1 :(得分:0)

要获得第一部分-具有XXX填充模块而没有非xxx填充模块的学生实例,您还可以执行以下操作:

select sm1.spr_code,sm1.mode_code
from cam_smo sm1 left outer join cam_smo sm2
on sm1.spr_code = sm2.spr_code
and sm1.mode_code <> sm2.mode_code
where sm2.mode_code is null and sm1.mode_code like '%XXX'