我有这样的表:
tbl_base
id primary_id
aaaa
bbbb
cccc
dddd eeee
tbl_current
id current_id
aaaa
bbbb qqqq
cccc
dddd zzzz
tbl_results
id value
aaaa 10
cccc 20
dddd 50
zzzz 10
eeee 5
我有一个与给定ID匹配的结果表(tbl_results
)。我想将此数据加入tbl_base
。不幸的是,有四种可能出现在tbl_results中的ID:
我想为tbl_results
建立一个左连接到tbl_base
:
SELECT
*
FROM
tbl_base
LEFT JOIN tbl_results
ON tbl_results.id = tbl_base_id
...
构建查询的最有效方法是什么,以便我将tbl_results.id
加入到ID存在的四种可能的排列中?我试过了:
SELECT
*
FROM
tbl_base
LEFT JOIN tbl_current
ON tbl_current.id = tbl_base.id
LEFT JOIN tbl_results
ON (tbl_results.id = tbl_base.id OR
tbl_results.id = tbl_base.primary_id OR
tbl_results.id = tbl_current.id OR
tbl_results.id = tbl_current.current_id)
这不起作用。问题是这些表在现实生活中很大,有数百万条记录,并且所有ID之间可能存在连接。我无法以任何方式改变表格的结构 - 我只是在使用我给出的系统。有关如何以最高效率执行此操作的任何想法?我只想在tbl_results
中返回任何行,其中ID与四个可能的ID中的任何一个匹配。
更新
这是我之后的输出:
id value
aaaa 10
bbbb NULL
cccc 20
dddd 50 --from 'dddd'
dddd 10 --from 'zzzz'
答案 0 :(得分:0)
现在您已发布所需的输出:
select distinct tbl_both.id, tbl_results.value from
(
select id, primary_id as secondary_id from tbl_base
union all
select id, current_id as secondary_id from tbl_current
) tbl_both
left outer join tbl_results on tbl_results.id in (tbl_both.id, tbl_both.secondary_id);
我没有测试过这个。希望它有效。