从具有某些条件的两个相同表中获取记录

Posted

技术标签:

【中文标题】从具有某些条件的两个相同表中获取记录【英文标题】:get records from two same tables with some condition 【发布时间】:2012-06-18 10:07:53 【问题描述】:

我有 2 个表 Test1 和 Test1Update,结构如下

Test1
id  name address

Test1Update 
id name address

这里 Test1 是旧表,而 Test1Update 只是 Test1 表的副本 我想在这种情况下获取记录,

if(Test1.id=Test1Update.id)

select macthing values from Test1Update tables,and remaining unmatched values from Test1 table

else if(Test1.id!=Test1Update.id)

select * from Test1 only

举个例子

Test1 有类似的数据

Test1
id  name   address
1   john    Ca
2   mary    La

and Test1Update has data like

id  name  address
1   john  Las Vega

s

现在我只想从 Test1Update 表中获取匹配的记录,并从

中获取所有不匹配的记录
Test1 table so final output will be

 id  name  address
 1   john  Las Vegas
 2   mary    La

这意味着只要有任何匹配项,就应该替换旧条目 使用 Test1Update 找到。

如何使用选择查询或过程来做到这一点?

告诉我一些方法。

【问题讨论】:

实际上你想选择 test1update 表的值,除非它们与 test1 表的值不同? 详细说明,update_table 是否包含表的所有行以及一些新行? 我试图用例子来阐述我的问题 是的,当且仅当它们与 test1 表的值不同时,我想选择 test1update 表的值,(简而言之,如果 test1 表中的任何值发生更改) 【参考方案1】:

假设 Test1Update 中的所有 id 都存在于 Test1 中,这可以简单地完成:

SELECT
  TEST1.ID,
  COALESCE(TEST1UPDATE.NAME, TEST1.NAME) as NAME,
  COALESCE(TEST1UPDATE.ADDRESS, TEST1.ADDRESS) as ADDRESS
FROM TEST1
LEFT JOIN TEST1UPDATE ON TEST1.ID = TEST1UPDATE.ID

在这里查看它的工作原理:http://sqlfiddle.com/#!3/4a1f2/3/0

使用 LEFT JOIN,如果 TEST1UPDATE 中没有匹配的条目,则 TEST1UPDATE.NAME 和 TEST1UPDATE.ADDRESS 为空。 COALESCE 为您提供了第一个非空参数,因此您已从 TEST1UPDATE 中获取值(如果存在),否则从 TEST1 中获取。 编辑 UNION 解决方案:

如果有很多字段,COALESCE 解决方案可能有点冗长,您想使用 UNION:

SELECT *
FROM TEST1UPDATE
INNER JOIN TEST1 ON TEST1.ID = TEST1UPDATE.ID

UNION

SELECT *
FROM TEST1
LEFT JOIN TEST1UPDATE ON TEST1.ID = TEST1UPDATE.ID
WHERE TEST1UPDATE.ID IS NULL;

【讨论】:

是的,它有效,但正如你所说,如果有很多字段,COALESCE 解决方案可能有点冗长,我想选择 40 多个字段,所以如果我使用 union ,它将选择两个列,如 test1.name、test1update.name,那么我应该考虑哪个值用于最终显示?我说的对吗? 不,你不是,这是一件令人高兴的事情,因为它是解决方案 :) 第一个 SELECT 只为您提供 TEST1UPDATE 中与 TEST1 匹配的行,第二个 SELET 为您提供行在 TEST1 中,不在 TEST1UPDATE 中。 UNION 将第二个结果集放在第一个结果集下,您不会得到重复的列:) 在 sqlfiddle 链接中尝试:)

以上是关于从具有某些条件的两个相同表中获取记录的主要内容,如果未能解决你的问题,请参考以下文章

Hive 到 Hive ETL

如何查询多个表以获取表具有相同列名的记录

如何从一个表中查找多个列满足不同条件的记录?

Oracle - 具有连接条件的外部连接

如何从两个表中选择同一字段中具有相同值的行?

选择某些键值相同的数据库记录