我正在尝试查找一个实例,其中学生在名为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,但不是...
答案 0 :(得分:1)
对我来说,这听起来像exists
和not 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'