2010-09-22 4 views
1

Quel peut être un moyen efficace pour le problème suivant dans SQL 2008?Comment faire une jointure externe avec une colonne basée sur le nombre?

Les deux premiers sont des tables d'entrée, à l'aide que je dois remplir la 3ème (tableau DataOut)

Fondamentalement, WDATA aura zéro ou plusieurs lignes correspondant à chaque ligne du tableau DataIn. Je dois remplir la table DataOut avec toutes les lignes, y compris aucune correspondance et plusieurs correspondances et remplir une colonne d'état différenciant entre une seule ligne correspondante dans WDATA, aucune ligne dans WDATA, ou exactement une ligne dans WDATA.

DataIn 
QID RID DOB 
------------- 
1 1 01/01/1980 
1 2 03/01/1981 
1 3 01/02/1991 



WDATA(key is QID, RID,PID) 
QID RID PID 
--------------- 
1 1 101 
1 1 102 
1 3 204 



DataOut 
QID RID PID status 
----------------------- 
1 1 101 ”multiple match” 
1 1 102 ”multiple match” 
1 2 null ”no match” 
1 3 204 ”single match” 

Répondre

2

Que pensez-vous de cette requête?

SELECT 
    di.QID, di.RID, w.PID, 
    CASE (SELECT COUNT(*) FROM WDATA w2 WHERE di.QID = w2.QID AND di.RID = w2.RID) 
     WHEN 0 THEN 'no match' 
     WHEN 1 THEN 'single match' 
     ELSE 'multiple match' 
    END AS 'Status' 
FROM 
    DataIn di 
LEFT OUTER JOIN 
    WDATA w ON di.QID = w.QID AND di.RID = w.RID 

Pour moi, il produit cette sortie:

QID RID PID Status 
1 1 101 multiple match 
1 1 102 multiple match 
1 2 NULL no match 
1 3 204 single match 

Est-ce que vous cherchez ??

+0

Merci! Laissez-moi essayer ceci sur mes données –

+0

Cela semble fonctionner parfaitement pour moi. Merci! –

0

Essayez ceci:

SELECT di.QID,di.RID,wd.PID, 
CASE 
    WHEN wd.PID is null THEN 'no match' 
    WHEN COUNT(di.QID) = 1 THEN 'single match' 
    WHEN COUNT(di.QID) > 1 THEN 'multiple match' 
END 
FROM DataIn as di 
LEFT JOIN WDATA as wd 
ON di.QID = wd.QID AND di.RID = wd.RID 
GROUP BY di.QID,di.RID,wd.PID 
+0

Vous avez manqué "GROUP BY di.QID, di.RID, wd.PID" mais avec ceux sur le vôtre est mieux que le mien:/ – Meff

+0

Look propre et compact, et enregistre un compte! Je le vérifie sur mes données maintenant. –

+0

Dans votre ligne GROUP BY di.QID, di.RID, wd.PID, en raison du groupement PID, la requête ne crée aucun enregistrement de correspondance multiple car PID sur deux lignes sera différent. Une idée de ce que je peux réparer ici? –

0

Cela semble OK, je pense qu'il peut être amélioré si.

DECLARE @DataIn TABLE 
(
    QID INT NOT NULL, 
    RID INT NOT NULL, 
    DOB DATE NOT NULL 
) 
INSERT INTO @DataIn 
VALUES 
(1,1,'01/01/1980'), 
(1,2,'03/01/1981'), 
(1,3,'01/02/1991') 

DECLARE @WDATA TABLE 
(
    QID INT NOT NULL, 
    RID INT NOT NULL, 
    PID INT NOT NULL   
) 
INSERT INTO @WDATA 
VALUES 
(1,1,101), 
(1,1,102), 
(1,3,204) 

;WITH OuterCTE(QID, RID, PID) AS 
(
SELECT 
    ISNULL(D.QID, W.QID) AS QID, 
    ISNULL(D.RID, W.RID) AS RID,  
    W.PID 
FROM @DataIn AS D FULL OUTER JOIN @WDATA AS W ON W.RID = D.RID AND W.QID = D.QID 
) 

SELECT 
    CTE.QID, 
    CTE.RID, 
    CTE.PID, 
    CASE 
     WHEN COUNT(W.PID) = 0 THEN 'no match' 
     WHEN COUNT(W.PID) = 1 THEN 'single match' 
     ELSE 'multiple match' 
    END 
FROM 
    OuterCTE AS CTE 
    LEFT JOIN @WDATA AS W 
    ON CTE.QID = W.QID 
    AND CTE.RID = W.RID 
GROUP BY 
    CTE.QID, 
    CTE.RID, 
    CTE.PID 
Questions connexes