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 范围索引

《SQL Server 2008从入门到精通》--20180629

合并列并获取计数 SQL Server 2008

如何在 sql server 2008 中获取没有约束的表列?

根据 SQL Server 2008R2 中表中的列获取计数

更新表以按分组列显示总计 SQL Server 2008 R2