检查子查询中是否存在记录

Check if record exists in subquery

我有以下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

SourceUser

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

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

使用这些参数,查询应该return像这样

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

访问列是布尔值(位)

所以本质上查询应该 return 所有来源(ID 和名称)是给定 SiteId 的给定 AccountId 的一部分,以及一个布尔值告诉我用户是否可以访问它.

知道如何进行吗?

谢谢

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

 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

试试这个:

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