【问题标题】:Check if record exists in subquery检查子查询中是否存在记录
【发布时间】:2015-06-04 07:38:28
【问题描述】:

我有以下 3 个表

来源

Id | Name         | SiteId
---+--------------+---------
1  | Source 1     | 1
2  | Source 2     | 1
3  | Source 3     | 2
4  | Source 4     | 2

来源账户

SourceId | AccountId
---------+----------
1        | 1
2        | 1
3        | 1
4        | 1

来源用户

SourceId | UserId
---------+----------
1        | 1
3        | 1

我正在尝试使用以下参数构建查询

  • 站点 ID (1)
  • 帐户 ID (1)
  • 用户 ID (1)

使用这些参数,查询应该返回类似这样的内容

SourceId | Name         | Access
---------+--------------+---------
1        | Source 1     | 1
2        | Source 2     | 0

访问列是布尔值(位)

因此,从本质上讲,查询应该返回作为给定 SiteId 的给定 AccountId 一部分的所有源(Id 和名称)以及一个告诉我用户是否有权访问它的布尔值。

知道如何进行吗?

谢谢

编辑: 为了记录,这里是我想出但不起作用的查询:

 SELECT s.[Id], s.[Name]
      ,(IF EXISTS (SELECT 1 FROM [dbo].[SourceUser] su WHERE su.SourceId = s.[Id] AND su.UserId = 1)
            SELECT CAST(1 AS BIT)
        ELSE
            SELECT CAST(0 AS BIT))
  FROM [dbo].[Source] s
  INNER JOIN [dbo].[SourceAccount] sa ON sa.SourceId = s.Id
  WHERE sa.AccountId = 1
  AND s.SiteId = 1

可能还值得一提的是,我正在 SQL Azure 和 SQL Server 2012 上运行它

编辑 2:关系

      SiteAccount - Site - SiteUser - User
      |                 \               |
Account - SourceAccount - Source - SourceUser

【问题讨论】:

  • 这三个表之间的关系并不完全清楚,您有四个来源,每个来源都与帐户 1 相关,列标题是否正确?但我的想法是你应该使用左外连接
  • 这里没有加起来,Source 1 和 Source 2 都与站点 id 1 和帐户 id 1 相关,用户在您的表格中的位置是什么?
  • 我实际上剥离了 Account 和 User 表。事实上,来源是网站的一部分,可用于帐户,并且仅在某些用户可用的帐户内
  • 帐户 - SourceAccount - 来源 - SourceUser - 用户帐户 - 用户
  • 哇,这看起来不像任何东西......将在问题中添加它

标签: sql sql-server azure azure-sql-database


【解决方案1】:

试试这个:

SELECT s.[Id],
       s.[Name],
       CASE WHEN EXISTS (SELECT 1 FROM [dbo].[SourceUser] su WHERE su.SourceId = s.[Id] AND su.UserId = 1)
            THEN CAST(1 AS BIT)
            ELSE CAST(0 AS BIT)
       END AS Access
 FROM [dbo].[Source] s
 INNER JOIN [dbo].[SourceAccount] sa ON sa.SourceId = s.Id
 WHERE sa.AccountId = 1 AND s.SiteId = 1

【讨论】:

  • 我一直在浪费时间设置 sqlfiddles,我应该先开始查询 :D 你去吧sqlfiddle.com/#!3/755a0/2
  • AccountId 不是 SourceUser 的一部分,所以在这种情况下,我不能拥有 su.AccountId = 1
  • 所以 AccountId 变成了 UserId。我得到了结果,我将验证它是否适用于多种情况,但看起来像这样很好
  • 是的,只需在 case 语句中将 AccountId 更改为 UserID。已编辑。
  • 我确认一切正常!将接受答案并尝试添加额外的表格,如 EDIT 2 所示。谢谢
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 2012-08-13
相关资源
最近更新 更多