Проблема TSQL - таблица ссылок - PullRequest
2 голосов
/ 20 января 2011

Я пытаюсь сделать довольно прямую таблицу ссылок TSQL, но я падаю на первое препятствие, в основном я хочу двустороннюю ссылку.

Например ....

Если контакт 1 добавляет контакт 2, то контакт 2 подключается к контакту 1 (и наоборот), идея заключается в том, что запрос распознает их в паре.

Пример таблицы

RelatedDataID  UniqueID   Related_UniqueID  
-------------------------------------------    
1              AA          BB   
2              CC          DD                     
3

ПользователиТаблица

UserID  UniqueID   Username
----------------
1        AA       Bob    
2        BB       Fred    
3        CC       Charlie
4        DD       Billy

Таким образом, в основном, когда я запускаю запрос с UniqueID "AA", он возвращает

Username     RelatedID
------------------------    
Bob          1    
Fred         1    
Charlie      0
Billy        0

Но также, когда я запускаю его на UniqueID "CC", он должен возвращать

Username   RelatedID
---------------------
Bob        0    
Fred       0    
Charlie    2
Billy      2

Кто-нибудь знает, как мне этого добиться?Моя текущая хранимая процедура, кажется, возвращает только те, которые связаны, а не те, которые не связаны.Мне нужно, чтобы вернуть полный список всех пользователей, но чтобы RelatedID возвращался как 0 или RelatedDataID.

UniqueID - это GUID.

Вот мой оператор TSQL.

ALTER PROCEDURE sp_Test
 @CompanyID int,
 @UniqueID varchar(36),
 @PersonTypeID int
AS
BEGIN
 SET NOCOUNT ON;

 SELECT
  First_Name + ' ' + Last_Name AS Full_Name,
  ISNULL(RelatedDataID,0) AS RelatedDataID
 FROM
  Users
 LEFT JOIN
  Related_Data
 ON
  Users.UniqueID = Related_Data.UniqueID
 WHERE
  Users.PersonTypeID = @PersonTypeID
 AND
  Users.Deleted = '0'
 AND
  ((ISNULL(Related_Data.UniqueID,'') = '') OR (Related_Data.UniqueID = @UniqueID OR Related_Data.Related_UniqueID = @UniqueID))

Ответы [ 2 ]

0 голосов
/ 20 января 2011

( ОБНОВЛЕНИЕ ) Учитывая, что вы упомянули в комментариях, что столбцы UniqueId являются направляющими, и вы хотите, чтобы ноль возвращался, когда нет отношений, мы должны использовать guids для varchar.Также не ясно, каким должен быть ожидаемый результат, если данный пользователь имеет несколько отношений.Этот запрос выберет отношение для User.UniqueID = RelatedData.UniqueId вместо отношения для User.UniqueId = RelatedData.Related_UniqueId, но вернет только одну строку для пользователя.

Select U.username
    , U.FirstName + ' ' + U.LastName As Full_Name
, Case 
    When RD.Related_UniqueID Is Not Null Then RD.RelatedDataId
    When RD1.UniqueId Is Not Null Then RD1.RelatedDataId
    Else 0
    End As RelatedID
From Users As U
    Left Join Related_Data As RD
        On RD.UniqueID = U.UniqueId
            And (
                RD.Related_UniqueID = @UniqueId
                Or RD.UniqueId = @UniqueId
                )
    Left Join Related_Data As RD1
        On RD1.Related_UniqueID = U.UniqueId
            And RD1.UniqueID = @UniqueId
Where U.Deleted = '0'
    And U.PersonTypeId = @PersonTypeId
0 голосов
/ 20 января 2011

Просто переместите условие UniqueID (фильтр / где) в состояние LEFT JOIN

ALTER PROCEDURE sp_Test
 @CompanyID int,
 @UniqueID varchar(36),
 @PersonTypeID int
AS
BEGIN
 SET NOCOUNT ON;

 SELECT
  First_Name + ' ' + Last_Name AS Full_Name,
  ISNULL(RelatedDataID,0) AS RelatedDataID
 FROM
  Users
 LEFT JOIN
  Related_Data
 ON
  Users.UniqueID = Related_Data.UniqueID
 AND
  ((ISNULL(Related_Data.UniqueID,'') = '') OR (Related_Data.UniqueID = @UniqueID OR Related_Data.Related_UniqueID = @UniqueID))
 WHERE
  Users.PersonTypeID = @PersonTypeID
 AND
  Users.Deleted = '0'
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...