2

私は、2 つのテーブルのレコードを「結合」する必要がある SQL クエリに取り組んでいます。つまり、レコードが table2 に存在する場合はそのレコードを使用し、そうでない場合は table1 の値にフォールバックする必要があります。

この例では、table1 と table2 には 2 つのフィールド (id と説明) しかありませんが、実際にはもっと多くのフィールドがある可能性があります。

ここに小さなテストケースがあります:

create table table1 (id int, description nvarchar(50))
create table table2 (id int, description nvarchar(50))

insert into table1 values (1, 'record 1')
insert into table1 values (2, 'record 2')
insert into table1 values (3, 'record 3')

insert into table2 values (1, 'record 1 modified')
insert into table2 values (2, null)

クエリの結果は次のようになります。

1, "record 1 modified"
2, null
3, "record 3"

これが私が思いついたものです。

select 
  case when table2.id is not null then 
      table2.id else table1.id 
  end as Id,
  case when table2.id is not null then 
      table2.description 
  else 
      table1.description 
  end as Description
    -- etc for other fields
from table1
left join table2 on table1.id = table2.id

私が望むものを達成するためのより良い方法はありますか? coalescetable1の対応する値がnullでない場合、table2からnull値を選択しないため、使用できないと思います。

4

2 に答える 2

2

どうですか:

SELECT t2.ID, t2.Description
FROM table2 t2
UNION ALL
SELECT t1.ID, t1.Description
FROM table1 t1
WHERE NOT EXISTS (SELECT * 
                  FROM table2 t2
                  WHERE t2.ID = t1.ID)

上記のクエリは、テーブル 2 からすべてのレコードを取得し (説明が NULL で ID が入力されている場合を含む)、テーブル 2 に存在しないテーブル 1 からのレコードのみを取得します。

于 2013-07-30T13:57:34.767 に答える
1

代替案は次のとおりです。

SELECT table2.*
FROM table1
    RIGHT JOIN table2
        ON table1.id = table2.id

UNION

SELECT table1.*
FROM table1
    FULL OUTER join table2
        ON table1.id = table2.id
WHERE table1.id NOT IN (SELECT id FROM table2)
--and table2.id not in (select id from table1)

table2 だけにある ID が必要ない場合は、最後の行に追加できます。それ以外の場合は、Stuart Ainsworth のソリューションの方が優れていると思います (つまり、すべての結合を削除します)。

http://sqlfiddle.com/#!3/03bab/12/0

于 2013-07-30T13:59:12.970 に答える