这是我的查询
SELECT
ISNULL(
(
select subjectshrt from subject_definition sd join student_subject ss
on(sd.sdsrno =ss.sdsrno1) where sd.tpbp LIKE ('p%')
)
,0)A,
ISNULL(
(
select subjectshrt from subject_definition sd join student_subject ss
on(sd.sdsrno =ss.sdsrno2) where sd.tpbp LIKE ('p%')
)
,0)b
这里首先选择查询返回1行,第2次返回多行 我收到了像
这样的错误子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
那么我该怎么做才能使这个查询工作
答案 0 :(得分:2)
您可以改用
select
case when exists(
select subjectshrt from subject_definition sd join student_subject ss
on (sd.sdsrno = ss.sdsrno1) where sd.tpbp LIKE ('p%')
) then 1 else 0 end as A,
case when exists(
select subjectshrt from subject_definition sd join student_subject ss
on (sd.sdsrno = ss.sdsrno2) where sd.tpbp LIKE ('p%')
) then 1 else 0 end as B
但是编写带有连接的select语句并获得适当的结果可能要好得多。
select case when sh.sdrno = ss.sdrno1 then sd.subjectshrt else 0 end as A, ... -- similar for B
from subject_definition sd
left join student_subject ss
on ((sh.sdsrno = ss.sdrno1) or (sh.sdsrno = ss.sdrno2))
where sd.tpbp like 'p%'
强烈建议检查执行计划以了解比较原因。
答案 1 :(得分:0)
您无法修改代码以使用一个查询并检查ON (sd.sdsrno IN (ss.sdsrno1,ss.sdsrno2))
吗?看起来这是唯一的改变。
(或者我可能在这里错过了最终结果。如果是这样,请随时发布您想要看到的几个示例输出)
SELECT COALESCE(subjectshirt,0) AS subjectshirt
FROM subject_definition
JOIN student_subject
ON (sd.sdsrno IN (ss.sdsrno1,ss.sdsrno2))
WHERE sd.tpbp LIKE 'p%'
或者首选“SELECT TOP 2”。
答案 2 :(得分:0)
尝试使用类似
的内容SELECT isnull(sd1.subjectshrt,0) as A , isnull(sd2.subjectshrt,0) as B
from student_subject ss left join subject_definition sd1 on sd1.sdsrno =ss.sdsrno1,
left join subject_definition sd2 on sd2.sdsrno =ss.sdsrno2