从具有某些条件的两个相同表中获取记录
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 链接中尝试:)以上是关于从具有某些条件的两个相同表中获取记录的主要内容,如果未能解决你的问题,请参考以下文章