摘要:我需要将来自prefix_2012
,prefix_2013
,prefix_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
,如何将所有基于年份的数据库中的记录合并,以便记录来自后一年,前几年记录被忽略为重复?这可以在没有显式循环和没有临时表的情况下完成吗?是否可以编写视图来执行此操作?
答案 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