2009-08-11 8 views
0
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)) 

Ce résultat Msg 102, niveau 15, état 1, ligne 32 Syntaxe incorrecte près de ')'.Comment sélectionner dans le jeu de résultats UNION ALL opération

+3

Ressemble au spam enveloppé dans une instruction SQL. –

+0

IPDSUMMARY, IPDSUMMARY, IPDSUMMARY, spam, ADMMASTER et IPDSUMMARY ne contiennent pas beaucoup de spam. * Vikings chanter ... * – zombat

+0

Je considérerais sérieusement une refonte de la base de données si je devais écrire une requête comme celle-ci. – idstam

Répondre

0

Mais bien sûr, ce que vous voulez dire est "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; 

Vous ne savez pas exactement ce que vous voulez appeler les colonnes. Vous voudrez probablement trouver une sous-requête appropriée pour mettre 't'. Et cela va gérer les valeurs NULL pour vous aussi.

4

Ajouter un alias après la dernière PAREN:

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

Vous n'avez pas besoin d'envelopper cela dans un select * pour obtenir le jeu de résultats, mais je suppose que vous utilisez comme un sous-requête. Lorsque vous définissez une sous-requête en tant que jeu de résultats, vous devez l'aliaser, sinon les colonnes ne savent pas d'où elles viennent.

+0

Ou supprimez select * from() et laissez simplement toutes les unions. –

+0

Cela m'a aidé à résoudre un problème avec une requête beaucoup plus simple (sélection parmi les résultats d'un seul UNION). Merci d'expliquer le 'pourquoi' derrière votre réponse! – Symmetric

0

Vous n'avez pas besoin de l'extérieur select * from - il suffit de mettre tous les choix avec union tous entrelacés - cela devrait fonctionner.

+0

dois aimer ce site - il y a une réponse et un vote avant de poster la réponse :) – OpenSource

Questions connexes