mysql - 基于另一个表中的值从一个表的行进行完全外连接
问题描述
我有这两张桌子:
CONTS
ID SRC_ID VAL
---- ------ ---
1000 100 2
1000 100 4
1000 100 8
1000 101 2
1000 101 0
1000 101 8
1000 102 2
1000 102 4
1000 102 8
1000 103 3
1000 103 5
1000 103 8
1001 110 12
1001 110 5
1001 111 12
and VALID:
ID SRC_ID VALID_ID
---- ------ --------
1000 101 102
1001 110 111
我需要一个 SQL 查询来连接 2 个具有数百万行的表。有 2 张桌子CONTS
和VALID
. 在 table 中VALID
,columnID
是主键(每个唯一 ID 只有一行)。
我需要得到这个结果:
ID SRC_ID1 VAL1 SRC_ID2 VAL2
---- ------- ---- ------- ----
1000 101 2 102 2
1000 NULL NULL 102 4
1000 101 0 NULL NULL
1000 101 8 102 8
1001 110 12 111 12
1001 110 5 NULL NULL
SQL 应该在 Teradata 或 Oracle 中工作。谢谢你。
解决方案
我几乎明白了,但不知道从性能角度来看这是否是最佳解决方案:
SELECT COALESCE(T1.ID, T2.ID) AS ID, T1.SRC_ID, T1.VAL, T2.SRC_ID AS SRC_ID, T2.VAL
FROM (
SELECT v.ID, v.SRC_ID, c1.VAL
FROM VALID v
LEFT JOIN CONTS c1 ON (c1.ID = v.ID and c1.SRC_ID = v.SRC_ID)
) T1
FULL OUTER JOIN (
SELECT v.ID, v.VALID_ID AS SRC_ID, c1.VAL
FROM VALID v
LEFT JOIN CONTS c1 ON (c1.ID = v.ID and c1.SRC_ID = v.VALID_ID)
) T2 ON (T2.ID = T1.ID and T2.VAL = T1.VAL)
推荐阅读
- flowtype - 如何在 React HOC 中描述流移除道具
- javascript - js 事件,如果用户点击浏览器的上下文菜单
- circuit-sdk - 电路 API 问题
- callback - RabbitMQ 是否为消费者保持开放连接?
- javascript - 当我将目的地设置为另存为 PDF 时,window.print() 不显示更多设置
- swift - 在模拟器上运行时出现链接器错误,可以在设备上运行,有人可以帮我解决这个问题吗?
- linux - 线程级并行 VS 进程级并行
- android - 隐形视图的触控能力
- javascript - 如何设计前端架构来处理 aem 中的多个品牌?
- java - Spring Boot 休息控制器未映射