SQL Server 2008 - 创建具有额外列“HasMutual”的视图
Posted
技术标签:
【中文标题】SQL Server 2008 - 创建具有额外列“HasMutual”的视图【英文标题】:SQL Server 2008 - Create a View With an Extra Column 'HasMutual' 【发布时间】:2011-11-25 02:57:41 【问题描述】:我正在尝试使用 SQL Server 2008 创建一个视图,它可以让我查看用户 a 和 b 是否有共同的朋友。
使用 a 和 b 存储在名为 Friendships
的表中作为发件人和收件人,并使用 IsPending
列指示友谊是否已被收件人批准。
反正主表是这样的:
Sender | Recipient | IsPending
(Stored on a single row.)
如何创建一个返回名为HasMutual
的额外列的视图,如果为假,则为 0,如果为真,则为 1?
谢谢。
【问题讨论】:
您将如何编写 SELECT 语句来执行此操作?从简单开始,写一个 SELECT 来显示 a 和 b 有哪些共同的朋友。从那里开始,它应该是微不足道的。 【参考方案1】:我希望我足够聪明,能够弄清楚这个查询!
我不敢相信前两个答案都得到了赞成票。这并非像 Ben Thul 所说的那样微不足道!
既然用单个查询很难解决这个问题,您会考虑另一种方法吗?
存储过程如何接收一对用户,然后列出他们共同的朋友?
(我假设IsPending = 1
表示他们还不是朋友)
CREATE PROCEDURE find_mutual_friends
(
@user1 varchar(255),
@user2 varchar(255)
)
as
SELECT
Friends
FROM
(SELECT
Friendships.Sender as Friends
FROM
Friendships
WHERE
Friendships.Recipient = @user1
and Friendships.IsPending = 0
UNION ALL
SELECT
Friendships.Recipient as Friends
FROM
Friendships
WHERE
Friendships.Sender = @user1
and Friendships.IsPending = 0) FriendsTempTable
WHERE
FriendsTempTable.Friends in
(SELECT
Friendships.Sender as Friends
FROM
Friendships
WHERE
Friendships.Recipient = @user2
and Friendships.IsPending = 0
UNION ALL
SELECT
Friendships.Recipient as Friends
FROM
Friendships
WHERE
Friendships.Sender = @user2
and Friendships.IsPending = 0)
【讨论】:
感谢您的回答。我已经有一个返回共同朋友列表的方法。但我的整个想法是在使用该方法之前,我想检查 HasMutual 是否为真,然后我可以获取该列表.. 我明白你的意思,但这无论如何都会损害性能。通常,您只处理 2 个人(即 Facebook)的上下文,所以只需获取列表,如果返回的行数 = 0,那么他们没有共同的朋友,否则列出朋友。该视图将是一个额外的数据库查询。【参考方案2】:CREATE VIEW ViewName
AS
SELECT
Sender , Recipient , IsPending, IsPending AS HasMutual
FROM myTable
【讨论】:
以上是关于SQL Server 2008 - 创建具有额外列“HasMutual”的视图的主要内容,如果未能解决你的问题,请参考以下文章
《SQL Server 2008从入门到精通》--20180629
如何在 sql server 2008 中获取没有约束的表列?