これを行う1つの方法は、テーブルからそれ自体への完全な外部結合を実行してから、合体を使用することです。
Select
COALESCE(Inside.Id, outside.id) Id,
COALESCE(Inside.date, outside.date) Date,
COALESCE(Inside.location, outside.location) Location
From
prod Inside
FULL OUTER JOIN prod Outside
ON Inside.id = Outside.iD
and Inside.location <> Outside.Location
Where
(Inside.Location = 'in-house'
or
Inside.Location is null)
and
(outside.Location = 'outside'
or
outside.Location is null)
デモ
ノート:
フィールドがnull許容になる可能性がある場合は、合体の代わりにCaseステートメントを使用し、IDフィールドを使用して使用するテーブルを決定することをお勧めします。例として日付を使用する
CASE WHEN Inside.Id is not null THEN Inside.date ELSE outside.date END date
デムズが指摘したように、これもそれ{id, location}
がユニークであると仮定しています。
アップデート
SQL Serverを使用していて、{ID、Location}は一意ではなく、最大の日付値が必要であり、常に外部ではなく社内を選択するためROW_NUMBER/WHERE RowNumber = 1
、ここでは、最初に場所で、次に日付で並べ替えることで、効果的に使用できます。
WITH cte
AS (SELECT Row_number() OVER ( partition BY ID
ORDER BY CASE LOCATION WHEN 'in-house' THEN 0
WHEN 'outside' THEN 1 END,
DATE DESC) rn,
ID,
Date,
Location
FROM prod)
SELECT ID,
Date,
Location
FROM cte
WHERE rn = 1
デモ
注caseステートメントを使用する必要はありませんでしたが、マッピングを明示的にしたかったのです。