2017-06-01 51 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