2009-05-03 52 views
0

我正在將數據從一個數據庫複製到另一個數據庫,並在進行數據處理時進行按摩。這兩個數據庫都有稱爲客戶端和作業的表。如何編寫SQL select語句以包含來自其他表的查找?

但是,在數據庫「Alpha」中,Jobs表與數據庫「Epsilon」所在的Clients表沒有關係。 Alpha's Jobs表的nvarchar列中只有客戶端名稱。

我需要一個select語句,在我將它插入到Epsilon的Jobs表中時,通過它們的名稱在Client表中查找客戶端ID。

我未完成的SQL語句如下:

insert into Epsilon.dbo.Jobs (ClientId, Name, Location, DateCreated) 
    select ????, Name, Location, DateCreated from Alpha.dbo.Jobs 

我怎麼能修改此使得????包含Epsilon客戶表中的ClientId?我知道我需要使用Jobs中的Name列來查找數據,但我無法弄清楚這個語法。

+0

很明顯,您可以選擇最適合該問題的答案,但是選中的答案在我發佈礦區後7分鐘發佈。 – 2009-05-03 15:50:07

回答

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 

這是一個非常樂觀的加盟,但即使需要修改這應該給你的總體思路。

+0

+1,但幾分鐘前你會給出基本相同的答案,所以他得到了複選標記。感謝您的迴應。 – 2009-05-03 15:48:02

1

INSERT INTO Epsilon.dbo.Jobs (客戶端Id,名稱,位置, dateCreated會) 從Alpha.dbo.Jobs選擇c.ClientId,名稱,位置,dateCreated會爲J 內連接Epsilon.dbo。客戶如c在 (j.ClientId = c.ClientId)

+1

他在Alpha.dbo.Jobs中沒有ClientID – 2009-05-03 15:20:43

+0

足夠接近+1。除了那個小小的錯誤之外,它和其他答案一樣。 :) – 2009-05-03 15:52:24

3

你需要的是一個連接。與幾乎每個人在開始時都認爲的幾乎相反,並不需要在數據庫模式中定義關係。他們只是要求你比較的兩列具有相同的類型(編輯見註釋)。

問題是你想要哪個連接。因爲沒有定義關係,所以可能有客戶有沒有工作和客戶,有客戶的工作和沒有的工作。

我假設你想要所有的JOBS存在,並且ClientId匹配CLIENTS表的地方引入了ClientId,並且這個關係不存在以便將ClientId留空。我們可以用一個LEFT JOIN來做到這一點。工作LEFT JOIN即使在與右側客戶定義的關係不存在的情況下,客戶也將帶入LEFT上的所有記錄。我們可以扭轉這兩種情況,做一個正確的加入,但這不是人們通常所做的。我會留給你閱讀其他類型的連接以及它們如何工作。

所以,你的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,您可以運行查詢,使之符合各之前編輯模式其他。