2010-03-23 52 views
0

位置表記錄具有兩個地址標識 - 郵寄地址和業務地址標識,它們指向地址表。TSQL - 如何在一個結果集中的多個表中加入1 .. *?

因此,地址表將包含最多兩個給定addressID的記錄。

給定一個位置ID,我需要一個存儲過程返回所有tbl_Location領域,並在一個結果所有tbl_Address領域:

  LocationID INT, 
      ClientID INT, 
      LocationName NVARCHAR(50), 
      LocationDescription NVARCHAR(50), 
      MailingAddressID INT, 
      BillingAddressID INT, 
      MAddress1 NVARCHAR(255), 
      MAddress2 NVARCHAR(255), 
      MCity NVARCHAR(50), 
      MState NVARCHAR(50), 
      MZip NVARCHAR(10), 
      MCountry CHAR(3), 
      BAddress1 NVARCHAR(255), 
      BAddress2 NVARCHAR(255), 
      BCity NVARCHAR(50), 
      BState NVARCHAR(50), 
      BZip NVARCHAR(10), 
      BCountry CHAR(3) 

我已經通過創建具有所需的字段臨時表開始,但我有點卡住如何做到這一點。

我可以爲每個所需的地址字段做子選擇,但似乎有點混亂。

我已經有了一個表值函數,它接受一個地址ID,並返回該ID的所有字段,但不知道如何將它集成到我所需的結果中。

手,它看起來像3選擇創建此表 - 1:位置,2:郵寄地址,3:帳單地址。

我想要做的就是創建一個視圖並使用它。

任何幫助將有所幫助。

謝謝。

回答

0

如果我理解你的問題正確,你想要的東西,如:

SELECT 
    L.*, 
    MAddress1 = M.Address1, 
    MAddress2 = M.Address2, 
    MCity = M.City, 
    MState = M.State, 
    MZip = M.Zip, 
    MCountry = M.Country 
    BAddress1 = B.Address1, 
    BAddress2 = B.Address2, 
    BCity = B.City, 
    BState = B.State, 
    BZip = B.Zip, 
    BCountry = B.Country 
FROM 
    tbl_Location L 
    INNER JOIN tbl_Address M 
     ON L.MailingAddressID = M.MailingAddressID 
    INNER JOIN tbl_Address B 
     ON L.BillingAddressID = B.BillingAddressID 
WHERE 
    L.LocationID = @LocationID 
+0

謝謝Chris和Tliebe。我和Tliebe的回答一起去了,因爲我不需要做所有的AS。兩者都工作得很好,比我想象中的解決方案簡單得多:)。 – ElHaix 2010-03-23 19:09:44

4

東西沿着以下的行會的工作:

select L.*, 
a1.Address1 as MAddress1, a1.Address2 as MAddress2, 
a2.Address1 as BAddress1, a2.Address2 as BAddress2 
from location L 
    inner join Address a1 on (a1.AddressId = L.MailingAddressId) 
    inner join Address a2 on (a2.AddressId = L.BillingAddressId) 

我並沒有把所有的領域,但你的想法。

請注意,如果任何一個地址標識可能爲空,您可能會改爲使用左連接。

+0

+1,改變'內join's爲'左joins'如果location.MailingAddressId或BillingAddressId是空。 – 2010-03-23 18:38:51