2つのテーブル間の結合を行い、レコードがあるかどうかに基づいて列を選択するとします。私は同じフィールドの複数を持つことを避けようとしており、それらを単一の列に凝縮しようとしています。ような何か:NULLSと存在しないレコードを確認するSQL Caseステートメント
Select
id = (CASE WHEN a.id IS NULL THEN b.id ELSE a.id END),
name = (CASE WHEN a.name IS NULL THEN b.name ELSE a.name END)
From Table1 a
Left Join Table2 b
On a.id = b.id
Where a.id = @id
私はレコードが存在する場合id
はTable1
から移入するように、しかし、Table2
から引っ張らない場合と思います。前のコードでは、の値がTable1
に存在しないため、レコードが返されないので、私の質問はどのようなレコードが存在するかどうかをチェックする方法です。また、私がしようとしていることを達成するためのより良い方法を誰もが知っているなら、指導と建設的な批評に感謝します。
EDIT
COALESCE
は私が達成しようとしている何のために働くように見えます。ちょうど私が働いているものに少し詳しい情報を与えて、私が最良の方法を使用しているかどうかについていくつかアドバイスをしたいと思います。
私は肥大化したテーブルTable2
を持っています。私はこのシステム用の新しいWebアプリケーションを構築する作業をしていますが、完全なデータベース再設計を正当化することはできませんので、私は「オンザフライ」でそれをやろうとしています。私は、新しいテーブルTable1
を作成しましたし、私は次の方法Get
(Select
)、Set
(Update
)、Add
(Insert
)、Remove
(Delete
)のためのストアドプロシージャを書いています。このように、私のコードでは、私は膨らんでいない単一のテーブルで作業しているように見えます。私のコードは単にSPメソッドの1つを呼び出し、ストアドプロシージャは古いテーブルと新しいテーブルの間のデータを処理します。私は現在Get
メソッドで作業しており、Table1
に存在しない場合は、古いテーブルTable2
をレコードとしてチェックする必要があります。ここでの提案に おかげで私のクエリは、現在、次のようになります。
Select
id = coalesce(a.id, b.student_number),
first_name = coalesce(a.first_name, b.first_name),
last_name = coalesce(a.last_name, b.last_name),
//etc
From Table1 a
Full Outer Join Table2 b
On a.id = b.student_number
Where (a.id = @id Or b.student_number = @id)
私が達成しようとしているものを、私はあれば任意のヒントや提案のために、経験豊富な群衆にそこにそれを投げるしたいためにこの作品これについてもっと良いやり方があります。
おかげ
+1不正な結合を使用していました。 – jon3laze