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

时间:2012-06-15 10:28:31

标签: mysql select stored-procedures if-statement

我有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

取值

现在我想只获取来自Test1Update表的匹配记录和来自

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

 id  name  address
 1   john  Las Vegas
 2   mary    La
  

这意味着只要有匹配就应该重新列入旧条目   在Test1Update中找到。

如何使用选择查询或按程序执行此操作?

告诉我某种方式。

1 个答案:

答案 0 :(得分:2)

假设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为您提供了第一个非null参数,因此您可以获得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;