2017-02-15 2 views
3

J'essaie de joindre ces deux tables ensemble pour montrer l'enregistrement dans la base et la null dans l'histoire. Le problème que j'ai est avec une jointure externe gauche. quand BO.val2 = 0: Je veux que la jointure utilise BO.VAL5 = TR.VAL5 seulement mais quand BO.val2 = TR.val2 je veux l'utiliser pour la jointure. Le code ci-dessous est une idée juste. Si vous avez des suggestions sur la façon de faire cela, ce serait génial!SQL: Left Outer rejoindre qui peut changer les colonnes à se joindre en fonction des données à l'intérieur de la colonne

SELECT DISTINCT  
    BO.RUN_DATE, 
    BO.val2, 
    BO.val3, 
    BO.val4, 
    BO.VAL5 
    TR.DTDATE, 
    TR.val2, 
    TR.val3, 
    TR.val4, 
    TR.val5 
FROM BASE BO      
LEFT OUTER JOIN HISTORY AS TR ON CASE 
    WHEN BO.val2 = 0 and BO.VAL5 = TR.VAL5 THEN ???? 
    WHEN BO.val2 = TR.val2 and BO.VAL5 = TR.VAL5 then ??? 
    ELSE ?? 
    END 
WHERE TRUNC(BO.POST_DATE)= TRUNC(SYSDATE) 
ORDER BY BO.VAL4 ; 

Répondre

0

Ce que vous devez faire est de rejoindre deux fois l'historique, en utilisant vos différentes conditions. Ensuite, vous pouvez utiliser un COALESCE() pour renvoyer les données

SELECT DISTINCT 
     BO.RUN_DATE, 
     BO.val2, 
     BO.val3, 
     BO.val4, 
     BO.VAL5 
     COALESCE(TR.DTDATE, TR2.DTDATE) AS DTDATE, 
     COALESCE(TR.val2, TR2.val2) AS val2, 
     COALESCE(TR.val3, TR2.val3) AS val3, 
     COALESCE(TR.val4, TR2.val4) AS val4, 
     COALESCE(TR.val5, TR2.val5) AS val5 
    FROM BASE BO      
    LEFT OUTER JOIN History AS TR ON TR.VAL5 = BO.VAL5 
    LEFT OUTER JOIN History AS TR2 ON TR2.VAL2 = BO.VAL2 
    WHERE TRUNC(BO.POST_DATE)= TRUNC(SYSDATE) 
    ORDER BY BO.VAL4 ; 
1

Vos deux variantes ont BO.VAL5 = TR.VAL5 en commun. La deuxième partie de la logique est BO.val2 = TR.val2 ou BO.val2 = 0.

Ainsi, l'état final devrait être:

SELECT DISTINCT 
    BO.RUN_DATE, 
    BO.val2, 
    BO.val3, 
    BO.val4, 
    BO.VAL5, 
    TR.DTDATE, 
    TR.val2, 
    TR.val3, 
    TR.val4, 
    TR.val5 
FROM 
    BASE AS BO 
    LEFT JOIN HISTORY AS TR 
     ON BO.VAL5 = TR.VAL5 AND (BO.val2 = 0 OR BO.val2 = TR.val2) 
WHERE 
    TRUNC(BO.POST_DATE) = TRUNC(SYSDATE) 
ORDER BY BO.VAL4; 
+0

merci vladimir! –

+0

@BeauJenkins, Bienvenue dans Stack Overflow. S'il vous plaît noter que la façon préférée de dire «merci» ici est par de bonnes questions et des réponses utiles (une fois que vous avez assez de réputation pour le faire), et en acceptant la réponse la plus utile à toute question (qui vous donne également un petit coup de pouce à votre réputation). Veuillez consulter la page [A propos de] et [Comment poser des questions ici?] (Http://stackoverflow.com/help/how-to-ask) –