如何UNION数据没有重复的关键字?

时间:2014-10-31 13:30:06

标签: sql-server key unique union sql-server-2014

摘要:我需要将来自prefix_2012prefix_2013prefix_2014等年份的数据库中的相同表的记录联合起来 - 没有基于的重复项唯一的id密钥。每年的数据库由第三方决定,我无法改变它。

是否可以将其定义为视图?

详细信息:使用以下示例对我想要的内容进行更详细的说明。它返回所有重复的记录。

SELECT
    id,
    a,
    b
FROM prefix_2014.mytable
UNION ALL
SELECT
    id,
    a,
    b
FROM prefix_2013.mytable
UNION ALL
    id,
    a,
    b
FROM prefix_2012.mytable

仅将UNION ALL替换为UNION时,合并相同的记录。 (只有当所有列中的值都相同时才这样。我是对的吗?)

创建新年数据库时,所有打开记录都会从去年转移,而去年的数据库内容已冻结。转移的记录最初是技术意义上的重复记录(所有列中的值相同)。但是,具有相同id的转移记录的内容可能会在以后更改。

问题:基于唯一id,如何将所有基于年份的数据库中的记录合并,以便记录来自后一年,前几年记录被忽略为重复?这可以在没有显式循环和没有临时表的情况下完成吗?是否可以编写视图来执行此操作?

2 个答案:

答案 0 :(得分:2)

您可以使用以下内容;

  WITH CTE AS(SELECT
    id,
    3 as [Year]
FROM prefix_2014.mytable 
UNION ALL
SELECT
    id,
    2 as [Year]
FROM prefix_2013.mytable
UNION ALL
Select
    id,
    1 as [Year]
FROM prefix_2012.mytable)
Select  ID,MAX([Year]) as YR into #T From CTE
group by ID


Select t.ID,a,b From #T t
join Test1 t1
on t1.id = t.id
where YR = 1
UNION ALL   
Select t.ID,a,b From #T t
join Test2 t2
on t2.id = t.id
where YR = 2
UNION ALL   
Select t.ID,a,b From #T t
join Test3 t3
on t3.id = t.id
where YR = 3

这是更新版本。它基本上是Kell查询的不同版本

答案 1 :(得分:2)

我没有这些表和数据,所以这可能需要一些工作 首先创建ID和年份的视图,如下所示:

CREATE VIEW YearIDs AS  
SELECT ID, Max(year) FROM
(SELECT
    id, 2014 as year
FROM prefix_2014.mytable
UNION 
SELECT
    id, 2013
FROM prefix_2013.mytable
UNION 
    id, 2012
FROM prefix_2012.mytable)
GROUP By ID )

现在加入你工会中的每个选择:

SELECT T1.id, T1.a, T1.b
FROM prefix_2014.mytable AS T1
INNER JOIN YearIDs AS Y1 ON Y1.Id = T1.ID AND Y1.year = 2014
UNION ALL
SELECT T2.id, T2.a, T2.b
FROM prefix_2013.mytable AS T2
INNER JOIN YearIDs AS Y2 ON Y2.Id = T2.ID AND Y2.year = 2013
UNION ALL
SELECT T3.id, T3.a, T3.b
FROM prefix_2012.mytable  Y3.Id = T3.ID AND AS T3
INNER JOIN YearIDs AS Y3 ON Y3.year = 2012