2011-01-19 46 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