2011-08-08 32 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