2011-01-19 41 views
2

我想做一个相当直接的TSQL链接表,但我在第一个障碍,基本上我想要一个双向链接。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)) 
+0

如果可能的话提供一个更详细的例子;为什么Bob在UniqueID = 2没有行时有一个UniqueID = 2的关系? – Andomar 2011-01-19 22:14:52

+0

如果Bob有多重关系会发生什么?例如,假设他与弗雷德和查理有关。 – Thomas 2011-01-19 22:19:12

+0

我想要做的是有双向链接。一个例子是,如果我通过了UniqueID“1”并且UniqueID 1链接到了UniqueID 2,它会显示所有的联系人,但是标志着UniqueID 1链接到了UniqueID 2,反之亦然。所以如果我把UniqueID 2,它会得到所有的联系人,并显示UniqueID 1被链接(因此RelatedDataID) – Tech 2011-01-19 22:31:52

回答

0

UPDATE)鉴于你在评论认为,唯一ID列的GUID提到的,你想一个当没有关系返回零时,我们必须将指针指向varchar。如果给定用户具有多重关系,那么也不清楚预期输出应该是什么。此查询将通过User.UniqueId = RelatedData.Related_UniqueId上的关系选择User.UniqueID = RelatedData.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

只需推动的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