Sql 如何基于列值进行条件联接
我有一张桌子:Sql 如何基于列值进行条件联接,sql,sql-server,tsql,stored-procedures,join,Sql,Sql Server,Tsql,Stored Procedures,Join,我有一张桌子: Activities{ActivityId, ActivityTypeId, CreatedByUserId, ItemId, FollowId} Items{ItemId, Title} Followings{FollowId, FollowerId, FollowingId} 在Activity表ItemId或FollowId中,可以为空(不能同时为空)。 现在,我需要以某种方式基于或activitypeid或者如果ItemId或FollowId中的一个为空,以加入项表或下
Activities{ActivityId, ActivityTypeId, CreatedByUserId, ItemId, FollowId}
Items{ItemId, Title}
Followings{FollowId, FollowerId, FollowingId}
在Activity
表ItemId
或FollowId
中,可以为空(不能同时为空)。现在,我需要以某种方式基于或
activitypeid
或者如果ItemId
或FollowId
中的一个为空,以加入项
表或下表。
如何编写这种条件查询?
如果ItemId
为空,我需要加入以下表。
如果ItemId
不为空,我需要加入Items
表。
我还询问了有关ActivityTypeId的问题,因为检查activity type可能更容易,并基于此创建项目或下表的联接。以下每一项都将返回不同的结果。第一个将返回(活动和项目)和(活动和后续活动)之间的所有关系。第二个将返回(活动和项目)和(活动和后续活动)之间的所有关系组合。两种方法都试一下,看看哪一种最适合你
(注意:我还没有测试这些-我是徒手写的-可能有语法错误)
或:
我不明白这一点:现在我需要以某种方式基于或ActivityTypeId,或者如果ItemId或FollowId中的一个为null,以加入到Items表或FollowId表。
我有一个更新的问题。您想在结果集中看到什么(什么列)?所有来自Activity、Items和FollowId,我认为这更容易。在应用程序中,我可以根据类型读取不同的列。@1110哪一个是优化的方式?
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
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