怎么做这个加入

时间:2011-08-08 00:25:18

标签: tsql sql-server-2008

与我的previous post here相关,我有以下SELECT

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][PhoneNum]中的[rtc]匹配,并且如果{{1}则匹配'User2'匹配[To],因为我不能让它们混乱。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

以下是使用CROSS APPLY时可以使用SQL Server 2008的一种方法.CROSS APPLY可帮助您将表与子查询联系起来。

在这种情况下,数据库 PhoneBills 中的表CallDetails会使用 From To 字段来驱动您的查询。这两个字段都必须通过加入 PhoneNumber 列中的 PhoneNumber 列,从数据库 rtc 中的表Resource获取用户名数据。表ResourcePhone也在数据库rtc中。

因此内部/子查询将连接表Resource和ResourcePhone,然后将使用它两次来获取User1和User2。对于User1,过滤器将使用数据库PhoneBills中CallDetails表中的From字段,对于User2,过滤器将使用数据库PhoneBills中表CallDetails中的To字段

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