我需要一个返回1列5行和第2列10行的查询

时间:2011-01-19 07:35:40

标签: sql tsql

这是我的查询

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。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

那么我该怎么做才能使这个查询工作

3 个答案:

答案 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