2017-08-22 3 views

Répondre

0

L'idée vous est de choisir une source et essayer pour trouver la transitivité avec deux cibles. Si ce sont les mêmes, alors vous avez la bonne combinaison.

J'ajoute des colonnes supplémentaires à des fins de débogage, mais la requête peut être simplifiée un peu plus.

SQL DEMO

SELECT * 
FROM (
     SELECT source.[V1], source.[V2], 
       target1.[V1] as t1_v1, 
       target1.[V2] as t1_v2, 
       target2.[V1] as t2_v1, 
       target2.[V2] as t2_v2, 
       CASE WHEN source.[V1] = target1.[V1] 
        THEN target1.[V2] 
        ELSE target1.[V1] 
       END as transitive1, 
       CASE WHEN source.[V2] = target2.[V2] 
        THEN target2.[V1] 
        ELSE target2.[V2] 
       END as transitive2  
     FROM A as source 
     JOIN A as target1 
      ON  (source.[V1] = target1.[V1] OR source.[V1] = target1.[V2]) 
      AND NOT (source.[V1] = target1.[V1] AND source.[V2] = target1.[V2]) 
     JOIN A as target2  
      ON  (source.[V2] = target2.[V1] OR source.[V2] = target2.[V2]) 
      AND NOT (source.[V1] = target2.[V1] AND source.[V2] = target2.[V2]) 
    ) T 
WHERE T.transitive1 = T.transitive2 

SORTIE

enter image description here

Pour obtenir le résultat que vous voulez sélectionner les colonnes de droite et ajouter le filtre aditional

SELECT T.[V1] as [V1], 
     T.[V2] as [V2], 
     T.[transitive1] as [V3] 

.... 

WHERE T.[V1] > T.[V2] 
    AND T.[V2] > T.[transitive1] 
    AND T.transitive1 = T.transitive2