2011-08-08 33 views
0

與我previous post here,我有以下SELECT如何做到這一點的JOIN

SELECT tc.[Time],tc.[From], tc.[To], tc.[Cost], tc.[Length], tc.[Type], tc.[PlaceCalled]  
FROM 
TelstraCall as tc 
WHERE 
[AccountNumber] IN (@AccountNumber) 
ORDER BY [Time] DESC 

我試圖讓[Username][Resource]鑑於[PhoneNum][rtc]比賽無論是[From][To],和Hogan已經和我一起幫助了上半場:

USE [rtc] 
SELECT [Username] 
FROM [dbo].[Resource] R 
JOIN ResourcePhone RP on R.ResourceId = RP.ResourceId 
WHERE RP.PhoneNum = tc.[From] 

現在我正在努力解決如何獲得'User1'的語法[From][rtc]中的[PhoneNum]匹配,如果[To][PhoneNum]匹配,則匹配'User2',因爲我不能讓它們混亂起來。

+0

任何Telstra的數據庫是沒有的朋友使用表CallDetails的To場礦! :) –

+1

'User1'是你想要定義的字符串,還是在表中找到?你能展示一些樣本數據和期望的結果嗎?它比任何人都更容易逆向工程你的單詞問題... –

+0

他們是字符串我想定義 – CodeMinion

回答

2

你想要做的是在同一個表上連接兩次,以獲得基於兩個不同引用的相關值。

爲此,您使用表別名。這裏有一個簡單的例子

SELECT u1.[Username] AS User1, u2.[Username] AS User2 
FROM TelstraCall tc 
INNER JOIN ResourcePhone rp1 ON tc.[From] = rp1.PhoneNum 
INNER JOIN Resource u1 ON rp1.ResourceId = u1.Id -- guessing at column names here 
INNER JOIN ResourcePhone rp2 ON tc.[To] = rp2.PhoneNum 
INNER JOIN Resource u2 ON rp2.ResourceId = u2.Id 
+0

我想你的意思是'外部連接',因爲'INNER'將只給出行匹配「From」和'To'。 –

+0

@Alexander我覺得必須同時有一個「From」和「To」參考(典型的電話情景),所以'INNER JOIN'是正確的類型 – Phil

+0

這會迫使[From]和[To]匹配爲了選擇該行?我不知道你可以加入同一個表兩次,謝謝:) – CodeMinion

1

這裏有一種方法可以做到這一點使用CROSS APPLY,因爲你使用的是SQL Server 2008的CROSS APPLY幫助您與子查詢加入你的表。

在這種情況下,表CallDetails數據庫PhoneBills驅動使用領域查詢。這兩個字段具有從表Resource在數據庫RTC也通過在數據庫RTC在表ResourcePhone******中國柱接合,以獲取用戶名數據

所以內部/子查詢將加入表Resource和ResourcePhone,然後它將被使用兩次來獲取User1和User2。對於用戶1,過濾器將使用From場在表CallDetails數據庫PhoneBills和用戶2,過濾器會在數據庫中PhoneBills

SELECT  USR1.UserName AS [User1] 
     , USR2.UserName AS [User2] 
FROM  PhoneBills.dbo.CallDetails CD 
CROSS APPLY (
       SELECT  Username 
       FROM  rtc.dbo.Resource  R 
       INNER JOIN rtc.dbo.ResourcePhone RP 
       ON   RP.ResourceID   = R.ResourceID 
       WHERE  RP.PhoneNumber   = CD.From    
      ) USR1 
CROSS APPLY (
       SELECT  Username 
       FROM  rtc.dbo.Resource  R 
       INNER JOIN rtc.dbo.ResourcePhone RP 
       ON   RP.ResourceID   = R.ResourceID 
       WHERE  RP.PhoneNumber   = CD.To    
      ) USR2 
+0

我不熟悉'CROSS APPLY',但是它們是否是實際的子查詢,對'CallDetails'中的每一行執行?如何將性能方面與直接連接進行比較,在所有情況下都有外鍵引用和正確索引? – Phil

+0

對不起,Siva,我只能選擇一個答案:(這很有趣,雖然,我試着看你的答案,看看它是如何工作的,雖然我得到了一個我以前沒見過的錯誤:「無法解決整理衝突在「SQL_Latin1_General_CP1_CI_AS」和「Latin1_General_BIN」之間等於操作。「 – CodeMinion

+0

您的猜測是正確的,我的一個數據源位於sql server 2005實例中,因此只有其中一個是2008 R2 – CodeMinion