Как это сделать ПРИСОЕДИНЯЙТЕСЬ - PullRequest
0 голосов
/ 08 августа 2011

В связи с моим предыдущим постом здесь , у меня есть следующее 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], и Хоган любезно помог мне с первой половиной:

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] и 'User2', если [To] соответствует [PhoneNum] вместо этого, потому что я не могу их запутать.

Ответы [ 2 ]

2 голосов
/ 08 августа 2011

То, что вы хотите сделать, это объединиться в одной и той же таблице дважды, чтобы получить связанные значения на основе двух разных ссылок.

Для этого вы используете псевдонимы таблиц.Вот простой пример

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 голос
/ 08 августа 2011

Вот один из способов сделать это, используя CROSS APPLY, поскольку вы используете SQL Server 2008. CROSS APPLY поможет вам объединить таблицу с подзапросами.

В этом случае таблица CallDetails в базе данных PhoneBills направляет ваш запрос, используя поля С и К . Оба эти поля должны извлекать данные Имя пользователя из таблицы Resource в базе данных rtc путем объединения со столбцом PhoneNumber в таблице ResourcePhone также в базе данных rtc.

Таким образом, внутренний / подзапрос объединит таблицы Resource и ResourcePhone, затем он будет использоваться дважды для выборки User1 и User2. Для User1 фильтр будет использовать поле From в таблице CallDetails в базе данных PhoneBills, а для User2 фильтр будет использовать поле To в таблице CallDetails в базе данных 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...