从连接表中选择记录(如果存在)

时间:2013-07-30 13:47:48

标签: tsql

我正在处理一个sql查询,它应该“合并”来自2个表的记录,即如果记录存在于table2中,它应该采用那个,否则它应该回退到table1中的值。

在示例中,table1和table2只有2个字段(id为描述),但显然实际上可能有更多。

这是一个小测试用例:

create table table1 (id int, description nvarchar(50))
create table table2 (id int, description nvarchar(50))

insert into table1 values (1, 'record 1')
insert into table1 values (2, 'record 2')
insert into table1 values (3, 'record 3')

insert into table2 values (1, 'record 1 modified')
insert into table2 values (2, null)

查询结果应如下所示:

1, "record 1 modified"
2, null
3, "record 3"

这就是我想出的。

select 
  case when table2.id is not null then 
      table2.id else table1.id 
  end as Id,
  case when table2.id is not null then 
      table2.description 
  else 
      table1.description 
  end as Description
    -- etc for other fields
from table1
left join table2 on table1.id = table2.id

有没有更好的方法来实现我想要的?我不认为我可以使用coalesce,因为如果table1中的相应值不为null,则不会从table2中选择空值。

2 个答案:

答案 0 :(得分:2)

怎么样:

SELECT t2.ID, t2.Description
FROM table2 t2
UNION ALL
SELECT t1.ID, t1.Description
FROM table1 t1
WHERE NOT EXISTS (SELECT * 
                  FROM table2 t2
                  WHERE t2.ID = t1.ID)

上述查询获取表2中的所有记录(包括描述为NULL但填充了ID的情况),以及表2中不存在于表2中的记录。

答案 1 :(得分:1)

这是另一种选择:

SELECT table2.*
FROM table1
    RIGHT JOIN table2
        ON table1.id = table2.id

UNION

SELECT table1.*
FROM table1
    FULL OUTER join table2
        ON table1.id = table2.id
WHERE table1.id NOT IN (SELECT id FROM table2)
--and table2.id not in (select id from table1)

如果您不希望仅在table2中的ID,则可以添加最后一行。否则我猜Stuart Ainsworth的解决方案更好(即放弃所有连接)

http://sqlfiddle.com/#!3/03bab/12/0