2013-02-18 5 views
-1

Supposons que le tableau exemple suivant:sql rejoindre table avec son sous-table

+-----+-----+-----+ 
| ID1 | ID2 | VAL | 
+-----+-----+-----+ 
| A | X | 1 | 
| A | Y | 2 | 
| A | Z | 3 | 
| B | X | 4 | 
| B | Z | 5 | 
| C | Y | 6 | 
+-----+-----+-----+ 

dire que je suis intéressé par ID1 = B et voudrais le comparer aux autres. La sortie désirée serait:

+---------+---------+---------+---------+---------+---------+---------+ 
| REF.ID1 | OTH.ID1 | REF.ID2 | REF.ID2 | REF.VAL | OTH.VAL | DIFF | 
+---------+---------+---------+---------+---------+---------+---------+ 
| B  | A  | X  | X  | 4  | 1  | 3  | 
| B  | A  | NULL | Y  | NULL | 2  | -2  | 
| B  | A  | Z  | Z  | 5  | 3  | 2  | 
| B  | B  | X  | X  | 4  | 4  | 0  | 
| B  | B  | Z  | Z  | 5  | 5  | 0  | 
| B  | C  | NULL | Y  | NULL | 6  | -6  | 
+---------+---------+---------+---------+---------+---------+---------+ 

Merci.

+1

quelle est la question? –

+0

Ma question est comment obtenir la sortie désirée. Qu'est-ce qui pourrait ne pas être clair? –

Répondre

2

Qu'est-ce que vous avez besoin est une jointure croisée:

SELECT Ref.Id, Oth.id, ...... 
FROM dbo.tbl AS Ref 
CROSS JOIN dbo.tbl AS Oth 
WHERE Ref.Id = 'B'; 

Pour plus d'informations sur les jointures vérifier ma série blog ici: http://sqlity.net/en/1146/a-join-a-day-introduction/

La jointure croisée est décrite ici: http://sqlity.net/en/1183/a-join-a-day-the-cross-join/

+0

D'une manière ou d'une autre, je ne peux pas trouver la solution de travail en utilisant 'cross join'. Pourriez-vous s'il vous plaît utiliser [this] (http://sqlfiddle.com/#!3/43b53/5) pour trouver la réponse? –

1

Cela devrait faire:

SELECT A.ID1 [REF.ID1], 
     A.ID1 [OTH.ID1], 
     CASE WHEN A.ID2 = B.ID2 THEN A.ID2 ELSE NULL END [REF.ID2], 
     B.ID2 [OTH.ID2], 
     CASE WHEN A.ID2 = B.ID2 THEN A.VAL ELSE NULL END [REF.VAL], 
     B.VAL [OTH.VAL], 
     CASE WHEN A.ID2 = B.ID2 THEN A.VAL ELSE 0 END - B.VAL [DIFF] 
FROM ( SELECT * 
     FROM YourTable 
     WHERE ID1 = 'B') A 
CROSS JOIN YourTable B 
+0

Désolé, mais ce n'est pas le cas. Voir [ici] (http://sqlfiddle.com/#!3/43b53/2). –

+1

@ danas.zuokas Ok, je vois comment les résultats ne correspondent pas complètement à celui que vous avez posté. Mais la réutilisation que vous voulez a quelques incohérences, par exemple, comment sommes-nous censés savoir quelle ligne avec 'ID1 = 'B'' doit comparer avec les 5 autres lignes ?, il n'y a pas de façon claire de faire la jointure que vous voulez – Lamak