0

我有这样的表:

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

tbl_results我有一个与给定 ID 匹配的结果表 ( )。我想将此数据加入到tbl_base. 不幸的是,tbl_results 中可能出现四个可能的 ID:

  1. tbl_base.id
  2. tbl_base.primary_id
  3. tbl_current.current_id (tbl_current.id = tbl_base.id)
  4. tbl_current.current_id (tbl_current.id = tbl_base.primary_id)

我想为 to 建立一个左tbl_results连接tbl_base

SELECT
  *
FROM
  tbl_base
LEFT JOIN tbl_results
  ON tbl_results.id = tbl_base_id
...

构造查询以使我加入tbl_results.idID 的四种可能排列的最有效方法是什么?我试过了:

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'
4

1 回答 1

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);

我没有测试过这个。希望它有效。

于 2013-10-17T20:16:53.333 回答