TSQL - 如果表B中存在相关行,则从表A中选择每一行 - 包括字段

时间:2014-09-12 09:16:41

标签: tsql

我有3张桌子

Tags
TagID
TagName

Users
UserID
Username

UsersFollowingTags
UFTID
UserID
TagID

许多用户可以关注许多代码。

我需要一个SQL语句来生成一个结果集,其中包含所有tagID& s& tagNames - 以及一个表示UserID是否跟随该标记的字段。

我尝试了左连接 - 但如果我包含WHERE userID = @userID - 它不会输出用户不会关注的标记。

指示相关行的字段可能只是一点 - 或者用户ID - 在那里是灵活的。

THX

2 个答案:

答案 0 :(得分:1)

而不是将userid=@userId放在where子句中,将其添加到left join子句中,您就可以了。

如果您在where表格中添加了left joined条款,则会与inner join相同。

如果您想要可能的以下用户名

,那就是这样的
select t.TagName, u.UserName
from Tags t
left join UsersFollowingTags uft on uft.TagID = t.TagID
left join Users u on u.UserId = uft.UserId and uft.userID = @userId

或者如果UserID足够

select t.TagName, uft.UserID
from Tags t
left join UsersFollowingTags uft on uft.TagID = t.TagID and uft.userID = @userId

或“bit”

select t.TagName, case when uft.UserID is null then 0 else 1 end as isfollowing
from Tags t
left join UsersFollowingTags uft on uft.TagID = t.TagID and uft.userID = @userId

答案 1 :(得分:1)

您可以使用CASE WHEN EXISTS

SELECT t.TagID,
       t.TagName,
       UserFollowing = CASE WHEN EXISTS(SELECT 1 FROM UsersFollowingTags uft
                                        WHERE t.TagID = uft.TagID
                                         AND  utf.UserID = @userID)
                        THEN 'Yes, user follows this tag'
                        ELSE 'No, user does not follow this tag' END
FROM dbo.Tags t