我不确定这是否是正确的方法,但我会解释这种情况。
我有两个表,第一个表是产品列表,第二个表是通道列表。如果满足连接条件,我想进行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工作。
指导非常感谢。
答案 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