2009-10-13 6 views
1

Disons que j'ai 2 tables avec la même structure: STOCK et NEW_STOCK. Ces tables ont une clé primaire composée de (ID_DATE, ID_SELLER, ID_INVOICE, ID_DOC).Comment joindre les résultats de deux tables dans Oracle 10

Maintenant, je dois obtenir pour tous (ID_DATE, ID_SELLER, ID_INVOICE, ID_DOC), la valeur du montant (champ MONTANT) en ce qui concerne cette exigence:

Si un enregistrement est présent dans NEW_STOCK, je reçois le MONTANT de NEW_STOCK, sinon, je reçois le MONTANT du tableau STOCK.

Notez que ID_DATE et ID_SELLER sont les entrées données à la requête, à savoir une requête qui ne tient compte que STOCK tableau ressemblera:

select AMOUNT, ID_DATE, ID_SELLER, ID_INVOICE 
    from STOCK 
    where ID_DATE = 1 
     and ID_SELLER = 'SELL1'; 

STOCK:

+---------+-----------+------------+--------+--------+ 
| ID_DATE | ID_SELLER | ID_INVOICE | ID_DOC | AMOUNT | 
+---------+-----------+------------+--------+--------+ 
|  1 |  SELL1 |  IN1 | DOC1 | 100 | 
|  1 |  SELL1 |  IN2 | DOC2 |  50 | 
|  1 |  SELL1 |  IN3 | DOC3 |  42 | 
+---------+-----------+------------+--------+--------+ 

NEW_STOCK:

+---------+-----------+------------+--------+--------+ 
| ID_DATE | ID_SELLER | ID_INVOICE | ID_DOC | AMOUNT | 
+---------+-----------+------------+--------+--------+ 
|  1 |  SELL1 |  IN2 | DOC2 |  12 | 
+---------+-----------+------------+--------+--------+ 

Ensuite, je dois obtenir le suivant les résultats de l'aile:

+---------+-----------+------------+--------+--------+ 
| ID_DATE | ID_SELLER | ID_INVOICE | ID_DOC | AMOUNT | 
+---------+-----------+------------+--------+--------+ 
|  1 |  SELL1 |  IN1 | DOC1 | 100 | 
|  1 |  SELL2 |  IN2 | DOC2 |  12 | 
|  1 |  SELL3 |  IN3 | DOC3 |  42 | 
+---------+-----------+------------+--------+--------+ 

ps: je travaille sur Oracle 10.

Répondre

3

utilisation jointure externe et la fonction NVL (arg1, arg2). Renvoie le premier argument s'il n'est pas NULL, sinon il renvoie le second argument. Exemple:

select s.AMOUNT, s.ID_DATE, s.ID_SELLER, s.ID_INVOICE, 
    NVL(n.AMOUNT, s.AMOUNT) amount  
from STOCK s, NEW_STOCK n 
where s.ID_DATE = n.ID_DATE(+) 
    and s.ID_SELLER = n.ID_SELLER(+) 
    and s.ID_INVOICE = n.ID_INVOICE(+) 
    and s.ID_DOC = n.ID_DOC(+) 
    and s.ID_DATE = 1 
    and s.ID_SELLER = 'SELL1'; 

Vous pouvez utiliser la syntaxe LEFT OUTER JOIN au lieu de (+) si vous trouvez plus lisible. J'utilise Oracle depuis la v7 et j'aime plus (+).

Voici LEFT OUTER JOIN syntaxe:

select s.AMOUNT, s.ID_DATE, s.ID_SELLER, s.ID_INVOICE, 
    NVL(n.AMOUNT, s.AMOUNT) amount  
from STOCK s left outer join NEW_STOCK n 
     on s.ID_DATE = n.ID_DATE 
     and s.ID_SELLER = n.ID_SELLER 
     and s.ID_INVOICE = n.ID_INVOICE 
     and s.ID_DOC = n.ID_DOC 
where s.ID_DATE = 1 
    and s.ID_SELLER = 'SELL1'; 
+0

Merci, ce fut ce que j'ai essayé, sauf que j'ai ajouté « n.ID_DATE = 1 et n.ID_SELLER = « SELL1 » » dans la partie où, qui ne travaillait pour les dossiers uniquement présents dans le tableau STOCK. Par ailleurs, comment écrire une "jointure externe gauche" quand il y a plus d'un champ utilisé pour la jointure? – romaintaz

+0

Non, c'est correct pour la "jointure externe gauche". Merci. – romaintaz

0
SELECT * FROM (
    SELECT * FROM new_stock 
    UNION ALL 
    SELECT * FROM stock 
    WHERE (ID_DATE,ID_SELLER,ID_INVOICE,ID_DOC) NOT IN 
    (SELECT ID_DATE,ID_SELLER,ID_INVOICE,ID_DOC FROM new_stock) 
) 
WHERE ID_DATE = 1 
    AND ID_SELLER = 'SELL1'; 
0

Les éléments suivants doivent travailler pour elle:

SELECT s.AMOUNT, s.ID_DATE, s.ID_SELLER, s.ID_INVOICE  
FROM STOCK s 
LEFT JOIN NEW_STOCK ns 
    ON s.ID_DATE = ns.ID_DATE 
    AND s.ID_SELLER = ns.ID_SELLER 
    AND s.ID_INVOICE = ns.ID_INVOICE 
WHERE s.ID_DATE = 1  
    AND s.ID_SELLER = 'SELL1' 
    AND ns.ID_DATE IS NULL 
UNION 
SELECT AMOUNT, ID_DATE, ID_SELLER, ID_INVOICE  
FROM NEW_STOCK  
WHERE ID_DATE = 1 
    AND ID_SELLER = 'SELL1'; 

Ne comptez pas les lignes appariées LEFT JOIN et UNION qui fixent les résultats de la table NEW_STOCK.

0
SELECT COALESCE(NS.AMOUNT, S.AMOUNT) AMOUNT, 
     S.ID_DATE, 
     S.ID_SELLER, 
     S.ID_INVOICE 
    FROM STOCK S 
    LEFT JOIN NEW_STOCK NS ON S.ID_DATE = NS.ID_DATE 
         AND S.ID_SELLER = NS.ID_SELLER 
         AND S.ID_INVOICE = NS.ID_INVOICE 
         AND S.ID_DOC = NS.ID_DOC 
WHERE S.ID_DATE = 1 
    AND S.ID_SELLER = 'SELL1' 
Questions connexes