2017-06-01 3 views
2

Je ne suis pas sûr que ce soit la bonne façon de procéder, mais je vais vous expliquer la situation.SQL - Croix Rejoindre lorsque la jointure gauche n'est pas atteinte

J'ai deux tables, la première table est une liste de produits tandis que la seconde est une liste de canaux. Je veux faire un LEFT JOIN si la condition de jointure est rencontrée sinon je veux exploser les rangées pour chaque canal dans la table CHANNEL. J'ai lu à propos de CROSS JOINs mais je ne sais pas si c'est le chemin à parcourir.

SELECT P.PRODUCT_ID, C.CHANNEL, C.REGION, C.COUNTRY, C.LANGUAGE FROM PRODUCT P LEFT JOIN CHANNEL C ON C.CHANNEL = P.CHANNEL;

Tableau de produit

Product_ID | Product_Name | Channel 
------------------------------------ 
12345678 | Product1  | Ecommerce 
87654321 | Product2  | 
14785236 | Product3  | Outlet 

canal Tableau

CHANNEL | REGION | COUNTRY | LANGUAGE 
-------------------------------------- 
Ecommerce | Americas | Canada | EN 
Ecommerce | Americas | Canada | FR 
Outlet | Americas | Canada | EN 
Outlet | Americas | Canada | FR 
[...] 

Je me attends à cette sortie:

PRODUCT_ID | CHANNEL | REGION | COUNTRY | LANGUAGE 
--------------------------------------------------- 
12345678 | Ecommerce | Americas | Canada | EN 
12345678 | Ecommerce | Americas | Canada | FR 
87654321 | Ecommerce | Americas | Canada | EN 
87654321 | Ecommerce | Americas | Canada | FR 
87654321 | Outlet | Americas | Canada | EN 
87654321 | Outlet | Americas | Canada | FR 
[...] 
14785236 | Outlet | Americas | Canada | EN 
14785236 | Outlet | Americas | Canada | FR 

Je travaille dans une base de données Oracle.

Le conseil apprécierait beaucoup pour cela.

+0

Quel SGBD utilisez-vous? –

+0

'sinon je veux exploser les lignes pour chaque canal de la table CHANNEL' - qu'est-ce que cela signifie? – TheUknown

+2

Pouvez-vous poster un exemple de données et un exemple de résultat souhaité? –

Répondre

2

Je pense que vous avez besoin d'une jointure où la condition est un match de canal (afin d'obtenir qu'un canal rejoint) ou product.channel is null (pour obtenir tous les canaux rejoint):

SELECT p.product_id, c.channel, c.region, c.country, c.language 
    FROM product p 
    JOIN channel c on c.channel = p.channel OR p.channel IS NULL; 
+0

Super, c'est exactement ce que je voulais! Je vous remercie. – Delphy

0

D'abord, la "P.CHANNEL" n'a pas l'air correct. Un produit ne peut avoir qu'un seul canal? On dirait que vous avez besoin d'une table xrefProductsChannels qui contient simplement ProductId et ChannelId.

Pour répondre à votre question, voici comment vous obtenez tous les produits avec tous les canaux:

SELECT P.PRODUCT_ID, 
C.CHANNEL, 
C.REGION, 
C.COUNTRY, 
C.LANGUAGE, 
CASE WHEN P.channel = C.channel THEN 1 ELSE 0 END HasChannel 
FROM PRODUCT P 
CROSS JOIN CHANNEL C