Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 如何加入_Tsql_Sql Server 2008 - Fatal编程技术网

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