mysql 根据左表中的值,对右表中的多个列之一进行左联接

afdcj2ne  于 2023-08-02  发布在  Mysql
关注(0)|答案(2)|浏览(119)

我有两个需要连接的表:表A必须是最左边的表,表B必须通过LEFT JOIN连接到最左边的表。我不能在这种情况下使用UNION。
表A:
| 数据类型| Data |
| --| ------------ |
| 布拉布拉| blahblahblah |
| 亚达| yadayadayada |
| 管他呢| whatever |
表B:
| 次要ID|更多_数据| More_Data |
| --|--| ------------ |
| 三个|等等等等| etc etc |
| 三个|无所谓| doesn't matter |
连接的理想方式是首先在主ID上连接,如果没有匹配项,则在辅助ID上连接。
加入结果:
| A.Data |B.Primary_ID| B.Secondary_ID| B.更多_数据| B.More_Data |
| --|--|--|--| ------------ |
| 布拉布拉|一个|三个|等等等等| etc etc |
| 亚达|||||
| 管他呢|四个|三个|无所谓| doesn't matter |
一个OR子句可以做到这一点:

SELECT *
FROM A
LEFT JOIN B ON A.ID = B.Primary_ID OR A.ID = B.Secondary_ID

字符串
然而,在更大的规模上它是非常低效的。
另一种选择是将其分为两个连接并合并结果:

SELECT A.*, 
       COALESCE(B1.Primary_ID, B2.Primary_ID),
       COALESCE(B1.Secondary_ID, B2.Secondary_ID),
       COALESCE(B1.More_Data, B2.More_Data), 
FROM A
LEFT JOIN B1 ON A.ID = B.Primary_ID
LEFT JOIN B2 ON A.ID = B2.Secondary_ID


但就我目前的工作规模而言,这是不可持续的。
那么,有没有什么方法可以在join语句中不使用UNION或OR子句,或者将其分解为多个join来实现结果呢?

wgmfuz8q

wgmfuz8q1#

我理解您对 predicate 中使用OR的连接的担忧,因为这可能会导致无效的连接。
但我不明白为什么两个连接选项与 * 合并 * 是 * 不可持续的 * -我会遵循这种方法。
无论如何,如果你正在寻找更进一步的变化,下面是一个例子-首先检查应该使用哪个键(主/次),并在单个id上执行简单的外部连接。

with one_id_tb as (
select 
 coalesce(ta.id,ta2.id) id,
 Primary_ID, Secondary_ID,
 More_Data
from tb
left outer join ta on tb.Primary_ID = ta.id
left outer join ta ta2 on tb.Secondary_ID = ta2.id
)
select 
  ta.id a_id, ta.data a_data, Primary_ID, Secondary_ID,More_Data
from ta 
left outer join one_id_tb
on ta.id = one_id_tb.id

a_id|a_data      |primary_id|secondary_id|more_data     |
----+------------+----------+------------+--------------+
   1|blahblahblah|         1|           3|etc etc       |
   2|yadayadayada|          |            |              |
   3|whatever    |         4|           3|doesn't matter|

字符串

qcuzuvrc

qcuzuvrc2#

SELECT
A.ID,
A.Data,
B.Primary_ID,
B.Secondary_ID,
B.More_Data
FROM
TableA A
LEFT JOIN (
SELECT Primary_ID, Secondary_ID, More_Data
FROM TableB
UNION
SELECT Primary_ID, Secondary_ID, More_Data
FROM TableB
) B ON A.ID = B.Primary_ID OR A.ID = B.Secondary_ID;

字符串

相关问题