0

あるデータベースから別のデータベースにデータをコピーし、そのデータベースにいる間にデータをマッサージしています。両方のデータベースには、クライアントとジョブと呼ばれるテーブルがあります。

ただし、データベース「Alpha」では、JobsテーブルはClientsテーブルとは関係がなく、データベース「Epsilon」とは関係があります。AlphaのJobsテーブルでは、nvarchar列にClients名が含まれています。

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列を使用してデータを検索する必要があることはわかっていますが、その構文を理解できません。

4

3 に答える 3

3

必要なのは結合です。ジョインは、ほとんどの人が開始時に考えるのとは反対に、データベースのスキーマで定義されたリレーションシップを必要としません。比較している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 と同じデータ型でない場合は、クエリを実行する前にスキーマを編集して、それらを互いに一致させることができます。

于 2009-05-03T15:21:20.363 に答える
2
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

これはかなり楽観的な結合ですが、変更が必要な場合でも、これで一般的なアイデアが得られるはずです。

于 2009-05-03T15:15:06.853 に答える
1

Epsilon.dbo.Jobs (ClientId、Name、Location、DateCreated) に挿入する c.ClientId、Name、Location、DateCreated を Alpha.dbo.Jobs から j として選択します。クライアントID)

于 2009-05-03T15:13:52.863 に答える