我有两个需要连接的表:表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来实现结果呢?
2条答案
按热度按时间wgmfuz8q1#
我理解您对 predicate 中使用
OR
的连接的担忧,因为这可能会导致无效的连接。但我不明白为什么两个连接选项与 * 合并 * 是 * 不可持续的 * -我会遵循这种方法。
无论如何,如果你正在寻找更进一步的变化,下面是一个例子-首先检查应该使用哪个键(主/次),并在单个
id
上执行简单的外部连接。字符串
qcuzuvrc2#
字符串