SQL连接到多个列

时间:2013-10-17 19:39:39

标签: sql sql-server

我有这样的表:

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:

  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)
  5. 我想为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'
    

1 个答案:

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

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