【问题标题】:How to UNION data without duplicates with respect to the key?如何在没有重复键的情况下合并数据?
【发布时间】:2014-10-31 13:30:06
【问题描述】:

总结:我需要合并数据库中相同表的记录,这些记录来自以年份命名的数据库,例如 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 时,相同的记录将被合并。 (只有当所有列中的值都相同时。我说的对吗?)

new-year数据库创建时,所有open记录都从上一年转移,上一年数据库内容被冻结。传输的记录最初在技术意义上是重复的(所有列中的值相同)。但是,相同id的传输记录的内容可能会在以后更改。

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

【问题讨论】:

  • 表之间ID是否连续?您是否只想在这些表中使用唯一的 a、b?
  • 只有 ID 是唯一的。 a 和 be 可能会改变。我只需要最新的a,b。并非所有 ID 都复制到新年。
  • 您使用的是哪个数据库服务器?甲骨文? DB2?
  • @JohnSaunders:Microsoft SQL 2014。
  • 最好使用标签。 “SQL”并不意味着“SQL Server”。它表示 SQL 语言。

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


【解决方案1】:

我没有这些表格和数据,所以这可能需要一些工作 首先创建一个 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 AS T3
INNER JOIN YearIDs AS Y3 ON Y3.Id = T3.ID AND Y3.year = 2012

【讨论】:

  • GROUP BY ID 后面可能不应该跟)。对于 Microsoft SQL 2014,GROUP 之前应该有 AS t。否则报语法错误。
  • 感谢您的帮助;)我终于以两种观点结束了。第一个提取 ids 和 max year,第二个选择较低的。
  • @pepr 你是对的,我确定,但我没有 sql 2014 并且没有运行查询,因为我没有这些表。只是凭记忆工作。
  • 嗯,谢谢 :) 我发现在我目前的角色中,我有很好的想象力和幽默感!
【解决方案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

这是更新版本。基本上是凯尔查询的不同版本

【讨论】:

  • 嗯,不确定这是否可行,因为 group by 子句包含所有三个字段,因此您将获得所有非重复数据
  • 如果他想拥有 ID,他可以包含 id,在他的问题中,我认为他指的是所有数据。如果不需要 ID,则可以简单地从 select 和 group by 中删除 id。
  • id 是唯一的,但 ab 可以更改。我只需要最新版本的abGROUP BY 还需要一些分组操作(如SUM...)。我说的对吗?
  • 如果 ID 是唯一的,并且您需要最新的 a 和 b 作为该唯一 ID,那么上面的查询应该可以工作。
  • @SurgeonofDeath:我用真实数据进行了尝试。当 2014、2013 和 2012 数据库按此顺序合并时,它并没有消除仅在 2012 和 2013 年出现的某些 ID 的重复性,但在 2014 年没有。返回两行 - 一个来自 2012 年,一个来自 2013 年。跨度>
猜你喜欢
  • 2020-12-29
  • 2019-04-03
  • 2019-06-26
  • 1970-01-01
  • 2012-09-16
  • 2016-10-05
  • 2020-08-23
  • 1970-01-01
  • 2020-03-13
相关资源
最近更新 更多