【问题标题】:Create View with data (not repeated) from 2 tables with the same structure使用来自具有相同结构的 2 个表的数据(不重复)创建视图
【发布时间】:2016-01-27 03:04:40
【问题描述】:

在 oracle 数据库中,我有 2 个具有相同结构(相同列)的表。一个正在迁移到另一个。问题是我需要创建一个从 2 个表中读取记录的视图,以便在迁移期间可以读取所有记录。如果有重复记录,则视图中应仅显示表 1 中的记录。

表 1

USER_ID       START_DATE       END_DATE
1             2015-08-12       2015-12-08
2             2015-02-25       2015-06-01
3             2015-04-14       2015-09-21

表 2

USER_ID       START_DATE       END_DATE
2             2015-02-25       2015-06-01
4             2015-12-20       2016-01-13

视图应包含以下数据:

USER_ID       START_DATE       END_DATE
1             2015-08-12       2015-12-08
2             2015-02-25       2015-06-01
3             2015-04-14       2015-09-21
4             2015-12-20       2016-01-13

这可能吗?

谢谢!

【问题讨论】:

  • 您要保留的表中的任何重复项?否则做一个UNION
  • 对于给定的 user_id,table2 中的开始/结束日期在 table1 中对于相同的用户 ID 是否可能不同,或者它们总是相同?另外,user_id 是主键还是唯一的?
  • @jarlh 如果有重复,表 1 中的行应该优先
  • @Boneist 对于相同的用户 ID,日期可能不同,但在这种情况下,应该显示表 1 中的日期
  • 我已经编辑了我的答案,现在它可以满足您的需求

标签: sql oracle


【解决方案1】:

如果当您说重复记录时,您的意思是所有 3 列都相同,那么我不明白您为什么要从表 a 中获取它们,因为它们是相同的。

此外,您可以将视图创建为:

select * from table1
union
select * from table2

这将消除所有重复项,并且基本上将保留 table1 中的重复项,因为它是第一个表(尽管没关系)

如果你固执地像你说的那样做这件事,可能是因为并非所有的列都需要相同。

那么你需要的是一个完整的外部连接

SELECT case when a.id is not null then a.id else b.id end as id,
case when a.id is not null then a.start_date else b.start_date end as start_date,
case when a.id is not null then a.end_date else b.end_date as end_Date
from table a full outer join table2 b on (a.id = b.id)

【讨论】:

  • 嗨@sagi,感谢您的宝贵时间。只有一件事:如果表 1 中存在一行,则应使用该表中的所有列,而不是表 2 中的列。显示表 2 中的行的唯一情况是表 1 中不存在 pk。在您的回答中,如果表 1 中的一列具有空值,它将从表 2 中获取值,但它应该从表 1 中获取值(也许空值是可能的值)。有意义吗?
  • 编辑了我的答案.. 它将通过 id @damian 检查所有内容
【解决方案2】:

这是我一直在寻找的答案,比 sagi 的答案更简洁

select *
from table1
union all
select *
from  table2 a
where  not exists (select null from table1 where user_id = a.user_id);

【讨论】:

  • 听着,首先你在这里写的和我的第一个查询一样——> select * from table1 union select * from table2, union(and not union all) 做你 WHERE 子句在做什么,所以基本上我回答你的问题不是你..
  • 第二,你告诉我重复意味着所有 3 行都存在,这就是为什么我编辑了帖子并进行了完整的外部连接,而你没有检查它。所以..acualy我应该得到V :)
  • 我很抱歉@sagi,但它不一样,因为您的查询不包括重复的记录。使用我在第二个选择中添加的 where 条件,它们被包括在内(因为它们被排除在第二个查询之外,它们不会重复)
猜你喜欢
  • 2019-10-28
  • 2020-01-05
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 2021-12-03
相关资源
最近更新 更多