別のテーブルからのルックアップを含めるために、SQL SELECTステートメントを作成するにはどうすればよいですか?
質問
あるデータベースから別のデータベースにデータをコピーし、その間にデータをマッサージしています。両方のデータベースには、クライアントとジョブと呼ばれるテーブルがあります。
ただし、データベースでは" Alpha&quot ;; JobsテーブルはClientsテーブルとは関係がありません。Clientsテーブルでは、データベース「Epsilon」します。 Alphaのジョブテーブルでは、nvarchar列にクライアント名のみが含まれています。
EpsilonのJobsテーブルに挿入しているときに、ClientテーブルのクライアントIDを名前で検索するselectステートメントが必要です。
未完成のSQLステートメントは次のようになります。
insert into Epsilon.dbo.Jobs (ClientId, Name, Location, DateCreated)
select ????, Name, Location, DateCreated from Alpha.dbo.Jobs
どうすればこれを変更して、???? EpsilonのClientsテーブルのClientIdが含まれていますか? JobsのName列を使用してデータをルックアップする必要があることは知っていますが、この構文はわかりません。
解決
insert into Epsilon.dbo.Jobs (ClientId, Name, Location, DateCreated)
select c.ClientID, a.Name, a.Location, a.DateCreated from Alpha.dbo.Jobs a
join Epsilon.dbo.Client c on c.Name = a.ClientName
これはかなり楽観的な結合ですが、変更する必要がある場合でも、一般的な考え方が得られるはずです。
他のヒント
必要なのは結合です。結合は、開始時にほとんどの人が考えることとは反対に、データベースのスキーマに定義された関係を必要としません。比較する2つの列が同じタイプであることが必要です(編集コメントを参照)。
問題は、どの結合が必要かということです。関係が定義されていないため、ジョブを持つクライアントとそうでないクライアント、およびクライアントを持つジョブと持たないジョブが存在する可能性があります。
存在するすべてのJOBSが必要であり、ClientIdがCLIENTSテーブルと一致し、ClientIdを持ち込み、その関係が存在せずにClientIdがnullのままになると想定しています。 LEFT JOINでこれを行うことができます。 Jobs LEFT JOINクライアントは、右側のクライアントと定義された関係が存在しない場合でも、すべてのレコードをLEFTに取り込みます。この2つを逆にしてRIGHT JOINを実行することもできますが、それは通常人々が行うことではありません。他の種類の結合とその仕組みについては、お読みください。
したがって、selectステートメントは次のようになります。
select ClientId, Name, Location, DateCreated
from Alpha.dbo.Jobs as J LEFT JOIN
Alpha.dbo.Clients as C ON j.ClientName = c.ClientName
Jobs.ClientNameがc.ClientNameと同じデータ型ではない場合、クエリを実行する前にスキーマを編集して、それらを互いに一致させることができます。
Epsilon.dbo.Jobsへの挿入 (ClientId、Name、Location、 作成日) jとしてAlpha.dbo.Jobsからc.ClientId、Name、Location、DateCreatedを選択します cとしてのEpsilon.dbo.Clientsの内部結合 (j.ClientId = c.ClientId)