SQL - 未满足左连接时的交叉连接

时间:2017-06-01 22:57:23

标签: sql oracle left-join cartesian-product cross-join

我不确定这是否是正确的方法,但我会解释这种情况。

我有两个表,第一个表是产品列表,第二个表是通道列表。如果满足连接条件,我想进行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 DB工作。

指导非常感谢。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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