如何基于列值进行条件连接

时间:2013-01-05 12:34:52

标签: sql sql-server tsql stored-procedures join

我有一张桌子:

Activities{ActivityId, ActivityTypeId, CreatedByUserId, ItemId, FollowId}
Items{ItemId, Title}
Followings{FollowId, FollowerId, FollowingId}

Activity表中ItemIdFollowId可以为空(从不同时)。
现在我需要以某种方式或ActivityTypeIdItemIdFollowId之一,如果为null,则加入Items表或Followings表。
如何编写这种条件查询?

如果ItemId为空,我需要加入Followings表 如果ItemId不为null,我需要加入Items表。
我还询问了ActivityTypeId,因为检查活动类型可能更容易,并根据它来加入项目或关注表。

1 个答案:

答案 0 :(得分:4)

以下各项将返回不同的结果。第一个将返回(行为和项目)和(活动和以下)之间的每个关系。第二个将返回(行为和项目)和(活动和以下)之间关系的每个组合。试试两者,看看哪种方式最适合你。

(注意:我没有测试过这些 - 我写的是徒手写的 - 可能存在语法错误)

SELECT  a.ActivityId, 
        a.ActivityTypeId,
        a.CreatedByUserId,
        i.ItemId,
        i.Title,
        null as FollowId,
        null as FollowerId,
        null as FollowingId
FROM    Activities a INNER JOIN Items i ON a.ItemId = i.ItemId
UNION ALL
SELECT  a.ActivityId, 
        a.ActivityTypeId,
        a.CreatedByUserId,
        null as ItemId,
        null as Title,
        f.FollowId,
        f.FollowerId,
        f.FollowingId
FROM    Activities a INNER JOIN Followings f ON a.FollowId = f.FollowId

OR:

SELECT  a.ActivityId, 
        a.ActivityTypeId,
        a.CreatedByUserId,
        i.ItemId,
        i.Title,
        f.FollowId,
        f.FollowerId,
        f.FollowingId
FROM    Activities a 
        LEFT OUTER JOIN Items i ON a.ItemId = i.ItemId
        LEFT OUTER JOIN Followings f ON a.FollowId = f.FollowId