【问题标题】:SQL - Cross Join when Left Join isn't metSQL - 不满足左连接时的交叉连接
【发布时间】:2017-11-03 05:44:46
【问题描述】:

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

我有两张表,第一张是产品列表,第二张是渠道列表。如果满足连接条件,我想做一个 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 数据库中工作。

非常感谢您的指导。

【问题讨论】:

  • 您使用的是什么 DBMS?
  • else I want to explode the rows for every channel in the CHANNEL table - 这是什么意思?
  • 你能发布一个数据示例和想要的结果示例吗?
  • "如果满足加入条件"?好吧,我只看到两种情况:product.channel is not null 然后它设置为我在频道表中找到的频道,或者product.channel is null 然后它当然没有设置为我在频道表中找到的频道。还是我错过了什么?
  • 啊,所以我理解正确,我的回答解决了你的问题:-)

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


【解决方案1】:

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

【讨论】:

  • 太好了,这正是我想要的!谢谢。
【解决方案2】:

首先,“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

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 2013-02-25
    • 2022-07-19
    • 2022-08-18
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多