【问题标题】:SQL Server 2008 - Create a View With an Extra Column 'HasMutual'SQL Server 2008 - 创建具有额外列“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 有哪些共同的朋友。从那里开始,它应该是微不足道的。

标签: sql sql-server select view


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2014-01-20
    • 2023-03-16
    • 2013-07-22
    相关资源
    最近更新 更多