2010-12-13 12 views
1

Salutations,Instruction SELECT imbriquée dans une expression CASE

Voici mon problème.
J'ai besoin d'obtenir des données de plusieurs lignes et de les renvoyer comme résultat unique dans une requête plus grande.

J'ai déjà posté une question similaire ici. Return multiple values in one column within a main query mais je soupçonne que mon manque de connaissance de SQL a rendu la question trop vague parce que les réponses n'ont pas fonctionné. J'utilise Microsoft SQL 2005.
Voici ce que j'ai.

Plusieurs tables avec CaseID comme PK, CaseID est unique.
Une table (tblKIN) avec CaseID et ItemNum (AutoInc) comme PK combinée.
Parce que chaque personne de la base de données aura probablement plus d'un parent.
Si j'exécute ce qui suit, dans une fenêtre de requête SQL, cela fonctionne.

DECLARE @KINList varchar(1000) 
SELECT @KINList = coalesce(@KINList + ', ','') + KINRel from tblKIN 
WHERE CaseID = 'xxx' and Address = 'yyy' 
ORDER BY KINRel 
SELECT @KINList 

Ceci retournera la relation de toutes les personnes qui vivent à la même adresse. les résultats ressemblent à ceci ...
Père, Nièce, Sœur, Fils

Maintenant, le problème pour moi est de savoir comment l'ajouter à ma requête principale?
Raccourcie aux informations pertinentes, la requête principale ressemble à ceci.

SELECT DISTINCT 
c.CaseID, 
c.Name, 
c.Address, 
Relatives=CASE WHEN exists(select k.CaseID from tblKIN k where c.CaseID = k.CaseID) 
    THEN DECLARE @KINList varchar(1000) 
     SELECT @KINList = coalesce(@KINList + ', ','') + KINRel from tblKIN 
     WHERE CaseID = 'xxx' and Address = 'yyy' 
     ORDER BY KINRel 
     SELECT @KINList 
    ELSE '' 
    END 
FROM tblCase c 
ORDER BY c.CaseID 

Les erreurs que je reçois sont.
Serveur: Msg 156, niveau 15, état 1, ligne 13
Syntaxe incorrecte près du mot clé 'DECLARE'.
Serveur: Msg 156, niveau 15, état 1, ligne 18
Syntaxe incorrecte à proximité du mot clé 'ELSE'.

J'ai essayé d'imbriquer les parenthèses entre DECLARE et la fin de SELECT @KINList.
J'ai essayé d'ajouter un BEGIN et END à la section THEN de l'instruction CASE.
Aucun travail.

Les données de la table source ressemblent à ceci. (périodes ajoutées pour une meilleure lisibilité)
tblCase
CaseID Nom Adresse
10-001 Jim ...... 100 Main St.
10-002 Tom .... 150 Elm St.
10-003 Abe ..... 200 1st St.

tblKIN
CaseID ItemNum Nom Relation Adresse
10-001 00001 Steve ... Son ........ 100 Main St.
10-002 00002 James..Father .... 150 Elm St.
10-002 00003 Betty .... Nièce ...... 150 Elm St.
10-002 00004 Greta ... Soeur ..... 150 Elm St.
10-002 00005 Davey..Son ........ 150 Elm St.
10-003 00006 Edgar ... Frère ... 200 1st St.Si j'exécute la requête pour CaseID = 10-002, il doit retourner ce qui suit:


CaseID Nom Adresse ....... parents
10-002 Tom ... 150 Elm St. ..Father, Nièce, Soeur, Fils

Je suis sûr que cela est probablement une solution simple, mais Je ne sais pas comment le faire.
Merci pour votre temps, et je m'excuse pour la longueur de la question, mais je voulais être clair.

Merci !!!

Répondre

0

Quand j'ai fait quelque chose de similaire, j'ai dû créer une fonction scalaire pour faire la coalesce qui retourne le résultat varchar. Ensuite, appelez-le dans le select.

CREATE FUNCTION GetRelatives 
(
    @CaseID varchar(10) 
) 
RETURNS varchar(1000) 
AS 
BEGIN 

    DECLARE @KINList varchar(1000) 
    SELECT @KINList = coalesce(@KINList + ', ','') + KINRel from tblKIN 
     WHERE CaseID = @CaseID 
    ORDER BY KINRel 

    RETURN @KINList 

END 

Ensuite, votre sélection

SELECT DISTINCT 
c.CaseID, 
c.Name, 
c.Address, 
database.dbo.GetRelatives(c.CaseID) AS Relatives 
FROM tblCase c 
ORDER BY c.CaseID 
+0

ont parfaitement fonctionné !!!!!! Merci !!!!! – Scottster

0

Vous pouvez créer un FUNCTION qui prend en compte l'argument caseID et renvoie true ou false.

Comme vous appelez plusieurs fois la requête imbriquée, il s'agit certainement d'une atteinte de performance. Une meilleure solution consiste à exécuter la requête et à stocker les résultats dans une table temporaire. Ensuite, passez cette table temporaire et le caseID au FUNCTION et vérifiez le confinement.

Questions connexes