我试图做一个相当直接的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))发布于 2011-01-20 06:18:22
( varchar UPDATE)鉴于您在注释中提到UniqueId列是guids,并且您希望在没有关系时返回零,我们必须将guids大小写转换为。如果给定用户有多个关系,那么预期输出应该是什么也是不清楚的。此查询将选择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发布于 2011-01-20 06:05:39
只需将UniqueID (筛选器/where)条件移动到左连接条件中
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'
ENDhttps://stackoverflow.com/questions/4741297
复制相似问题