Tsql 如何加入
与我的相关,我有以下Tsql 如何加入,tsql,sql-server-2008,Tsql,Sql Server 2008,与我的相关,我有以下选择: 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 考虑到[rtc]中的[PhoneNum]与[From]或[to]匹配,我正试图从[Resource]中获取[
选择:
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
考虑到[rtc]
中的[PhoneNum]
与[From]
或[to]
匹配,我正试图从[Resource]
中获取[Username]
,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”,因为我不能让它们乱成一团。您要做的是在同一个表上联接两次,以获得基于两个不同引用的相关值
为此,可以使用表别名。这里有一个简单的例子
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
您要做的是在同一个表上联接两次,以基于两个不同的引用获取相关值
为此,可以使用表别名。这里有一个简单的例子
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
因为您使用的是SQL Server 2008,所以这里有一种方法可以使用交叉应用来实现这一点。交叉应用帮助您使用子查询连接表
在这种情况下,数据库PhoneBills中的表CallDetails
使用From和To字段驱动查询。这两个字段都必须通过与数据库rtc中表ResourcePhone
中的PhoneNumber列连接,从数据库rtc中的表Resource
中获取用户名数据
因此,内部/子查询将连接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
因为您使用的是SQL Server 2008,所以这里有一种方法可以使用交叉应用来实现这一点。交叉应用帮助您使用子查询连接表
在这种情况下,数据库PhoneBills中的表CallDetails
使用From和To字段驱动查询。这两个字段都必须通过与数据库rtc中表ResourcePhone
中的PhoneNumber列连接,从数据库rtc中的表Resource
中获取用户名数据
因此,内部/子查询将连接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
任何电信数据库都不是我的朋友!:)“User1”是您要定义的字符串,还是在表中的某个地方找到的?你能展示一些样本数据和期望的结果吗?这比每个人反向工程你的单词问题要容易得多……它们是字符串,我想定义它们——任何电信数据库都不是我的朋友!:)“User1”是您要定义的字符串,还是在表中的某个地方找到的?你能展示一些样本数据和期望的结果吗?这比每个人反向工程你的单词问题要容易得多…它们是字符串我想定义我猜你的意思是外部连接
,因为内部
只会给出与From
和to
匹配的行@Alexander我认为必须同时有“From”和“to”引用(典型的电话呼叫场景)那么内部联接是正确的类型这会迫使[From]和[To]匹配以便选择行吗?我不知道您可以两次联接同一个表,谢谢:)@Kitler-both[From]
和[To]
必须与资源
表中的电话号码匹配才能检索记录。如果其中一条或两条可能不匹配,但您仍希望返回一条记录,请使用LEFT
而不是internal
joinsAh,我在前面的问题中提到了一些我忘了在这里添加的内容。我需要加入两个表,[Resource]包含用户名和ID对,[ResourcePhone]包含电话号码和ID对。因此,我需要[Resource]之外的用户名,但需要首先在[ResourcePhone]中找到匹配的ID。我猜你的意思是外部连接
,因为内部
只会给出与From
和to
匹配的行@Alexander我认为必须同时有“From”和“to”引用(典型的电话呼叫场景)那么内部联接是正确的类型这会迫使[From]和[To]匹配以便选择行吗?我不知道您可以两次联接同一个表,谢谢:)@Kitler-both[From]
和[To]
必须与资源
表中的电话号码匹配才能检索记录。如果其中一条或两条可能不匹配,但您仍希望返回一条记录,请使用LEFT
而不是internal
joinsAh,我在前面的问题中提到了一些我忘了在这里添加的内容。我需要加入两个表,[Resource]包含用户名和ID对,[ResourcePhone]包含电话号码和ID对。因此,我需要[Resource]中的用户名,但需要首先在[ResourcePhone]中找到匹配的ID。我不熟悉交叉应用
,但它们是实际的子查询吗,针对CallDetails
中的每一行执行?这如何将性能方面的连接与存在外键引用和适当索引的直接连接进行比较呢?对不起,Siva,我只能选择一个答案:(这很有趣,我正在尝试您的答案,看看它是如何工作的,尽管我遇到了一个我以前从未见过的错误!:“无法解决排序规则冲突b