我正在尝试寻找这样的例子:学生在名为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.mod_code列上返回空值,但事实并非如此……
发布于 2019-11-25 16:37:17
对我来说,这听起来像是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
);
发布于 2019-11-25 16:57:16
要只获取第一部分-具有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'
https://stackoverflow.com/questions/59036312
复制