与我的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]
,因为我不能让它们混乱。
答案 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