1

次の構造を持つ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 との一致が見つかった場合は常に、古いエントリを置き換える必要があることを意味します。

選択クエリまたは手順を使用してそれを行うにはどうすればよいですか?

方法を教えてください。

4

1 に答える 1

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 は null になります。 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;
于 2012-06-15T13:22:10.373 に答える