Как выбрать в наборе результатов UNION ALL операцию - PullRequest
0 голосов
/ 11 августа 2009
SELECT * FROM 
(SELECT BAR.DIAGNOSES FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.DIAGNOSES IS NOT NULL)
UNION ALL
SELECT BAR.UNDERLYINGCAUSE FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.UNDERLYINGCAUSE IS NOT NULL)
UNION ALL
SELECT BAR.UNDERLYINGCAUSE2 FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.UNDERLYINGCAUSE2 IS NOT NULL)
UNION ALL
SELECT BAR.UNDERLYINGCAUSE3 FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.UNDERLYINGCAUSE3 IS NOT NULL)
UNION ALL
SELECT BAR.UNDERLYINGCAUSE4 FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.UNDERLYINGCAUSE4 IS NOT NULL)
UNION ALL
SELECT BAR.UNDERLYINGCAUSE5 FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.UNDERLYINGCAUSE5 IS NOT NULL)
UNION ALL
SELECT BAR.COMPLICATIONS FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.COMPLICATIONS IS NOT NULL)
UNION ALL
SELECT BAR.COMPLICATIONS2 FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.COMPLICATIONS2 IS NOT NULL)
UNION ALL
SELECT BAR.COMPLICATIONS3 FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.COMPLICATIONS3 IS NOT NULL)
UNION ALL
SELECT BAR.COMPLICATIONS4 FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.COMPLICATIONS4 IS NOT NULL)
UNION ALL
SELECT BAR.COMPLICATIONS5 FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.COMPLICATIONS5 IS NOT NULL)
UNION ALL
SELECT BAR.OTHERDIAGNOSES FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.OTHERDIAGNOSES IS NOT NULL)
UNION ALL
SELECT BAR.OTHERDIAGNOSES2 FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.OTHERDIAGNOSES2 IS NOT NULL)
UNION ALL
SELECT BAR.OTHERDIAGNOSES3 FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.OTHERDIAGNOSES3 IS NOT NULL)
UNION ALL
SELECT BAR.OTHERDIAGNOSES4 FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.OTHERDIAGNOSES4 IS NOT NULL)
UNION ALL
SELECT BAR.OTHERDIAGNOSES5 FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN WHERE FOO.ADMWARD IN (16,17) AND (BAR.OTHERDIAGNOSES5 IS NOT NULL))

Этот результат Msg 102, Уровень 15, Состояние 1, Строка 32 Неверный синтаксис рядом с ')'.

Ответы [ 3 ]

4 голосов
/ 11 августа 2009

Добавьте псевдоним после последнего имени:

select
    *
from
   (.... unions go here ...) a

Вам не нужно заключать это в select *, чтобы получить набор результатов, но я предполагаю, что вы используете его как подзапрос,Когда вы выполняете подзапрос в качестве результирующего набора, вам нужно присвоить ему псевдоним, в противном случае столбцы не будут знать, откуда они берутся.

0 голосов
/ 11 августа 2009

Но, конечно, вы имеете в виду "UNPIVOT".

   SELECT * FROM 
   (SELECT FOO.ADMWARD, BAR.* FROM FOO INNER JOIN BAR ON FOO.AN = BAR.AN 
        WHERE FOO.ADMWARD IN (16,17)
   ) t
   UNPIVOT 
   (Diag FOR PropType in (DIAGNOSES
        , UNDERLYINGCAUSE
        , UNDERLYINGCAUSE2
        , UNDERLYINGCAUSE3
        , UNDERLYINGCAUSE4
        , UNDERLYINGCAUSE5
        , COMPLICATIONS
        , COMPLICATIONS2
        , COMPLICATIONS3
        , COMPLICATIONS4
        , COMPLICATIONS5
        , OTHERDIAGNOSES
        , OTHERDIAGNOSES2
        , OTHERDIAGNOSES3
        , OTHERDIAGNOSES4
        , OTHERDIAGNOSES5
        )
   ) u;

Не уверен, что вы хотите назвать столбцы. Вы, вероятно, захотите разработать соответствующий подзапрос для 't'. И это будет обрабатывать NULL для вас тоже.

0 голосов
/ 11 августа 2009

Вам не нужно внешнее select * from - в основном просто поместите все выборки с объединением всех чередующихся - оно должно работать.

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