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

SQL - Cross Join when Left Join isn't met

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

我有两个 table,第一个 table 是产品列表,第二个是频道列表。如果满足连接条件,我想执行 LEFT JOIN,否则我想为 CHANNEL table 中的每个通道展开行。我读过有关 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;

产品Table

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

频道Table

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 数据库中工作。

非常感谢指导。

我认为您需要一个内部联接,其中条件是频道匹配(以便加入一个频道)或 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;

首先,"P.CHANNEL" 看起来不对。一个产品只能有一个渠道?看起来您需要一个仅包含 ProductId 和 ChannelId 的外部参考产品频道 table。

为了回答您的问题,这是您通过所有渠道获得所有产品的方式:

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