web-dev-qa-db-fra.com

Comment écrire une sous-requête dans la déclaration OUTER JOIN

Je veux joindre deux tables CUSTMR et DEPRMNT.

Mon besoin est: LEFT OUTER JOIN DE deux ou plusieurs tables avec une sous-requête à l'intérieur de LEFT OUTER JOIN, comme indiqué ci-dessous:

Tableau: CUSTMR, DEPRMNT

Requête en tant que:

SELECT
    cs.CUSID
    ,dp.DEPID
FROM
    CUSTMR cs
        LEFT OUTER JOIN (
            SELECT
                    dp.DEPID
                    ,dp.DEPNAME
                FROM
                    DEPRMNT dp
                WHERE
                    dp.DEPADDRESS = 'TOKYO'
        )
            ON (
                dp.DEPID = cs.CUSID
                AND cs.CUSTNAME = dp.DEPNAME
            )
WHERE
    cs.CUSID != ''

Ici la sous-requête est:

SELECT
    dp.DEPID, dp.DEPNAME
FROM
    DEPRMNT dp
WHERE
    dp.DEPADDRESS = 'TOKYO'

Est-il possible d'écrire une telle sous-requête dans LEFT OUTER JOIN?

Je reçois une erreur lors de l'exécution de cette requête sur ma base de données DB2.

35
YROjha

Vous avez besoin de "l'identifiant de corrélation" (le "AS SS") sur la sous-sélection pour référencer les champs dans la condition "ON". Les identifiants attribués à l'intérieur de la sous-sélection ne sont pas utilisables dans la jointure.

SELECT
       cs.CUSID
       ,dp.DEPID
FROM
    CUSTMR cs
        LEFT OUTER JOIN (
            SELECT
                    DEPID
                    ,DEPNAME
                FROM
                    DEPRMNT 
                WHERE
                    dp.DEPADDRESS = 'TOKYO'
        ) ss
            ON (
                ss.DEPID = cs.CUSID
                AND ss.DEPNAME = cs.CUSTNAME
            )
WHERE
    cs.CUSID != '' 
64
James Anderson

Je pense que vous ne devez pas utiliser de sous-requête dans ce scénario. Vous pouvez directement quitter la jointure externe de la table DEPRMNT.

Lorsque vous utilisez la jointure externe gauche, n’utilisez pas les colonnes de la table RHS de la jointure dans la condition où, vous obtiendrez une sortie incorrecte.

0
padmanvg