мне нужен запрос, который возвращает 1 столбец 5 строк и 2 столбец 10 строк - PullRequest
0 голосов
/ 19 января 2011

вот мой запрос

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 ]

2 голосов
/ 19 января 2011

Вы можете использовать это вместо

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 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%'

Проверка планов выполнения по причинам сравнения настоятельно рекомендуется.

0 голосов
/ 19 января 2011

попробуйте использовать что-то вроде

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
0 голосов
/ 19 января 2011

Не можете ли вы изменить код для использования одного запроса и поставить отметку 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" является предпочтительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...