2017-06-01 43 views
2

我不確定這是否是正確的方式來做到這一點,但我會解釋情況。SQL - 交叉加入時不加入左連接

我有兩個表,第一個表是產品列表,第二個表是通道列表。如果連接條件滿足,我想要執行LEFT JOIN,否則我想爲CHANNEL表中的每個通道分解行。我已閱讀了有關CROSS JOIN的內容,但並不確定這是否可行。

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

產品表

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

頻道表

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

我期待這樣的輸出:

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 

我正在Oracle數據庫中工作。

指導將非常讚賞這一點。

+0

您正在使用什麼數據庫管理系統? –

+0

'否則我想爲CHANNEL表中的每個通道分解行 - - 這是什麼意思? – TheUknown

+2

你能發表一個數據的例子和想要的結果的例子嗎? –

回答

2

我想你需要一個內部聯接,其中狀況是信道匹配(這樣才能得到一個通道連接)或product.channel is null(以便讓所有通道加入):

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

太棒了,這正是我想要的!謝謝。 – Delphy

0

首先, 「P.CHANNEL」看起來不正確。一個產品只能有1個頻道?看起來你需要一個只有ProductId和ChannelId的xrefProductsChannels表。

要回答你的問題,你這是怎麼讓所有的產品與所有渠道:

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