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

时间:2015-06-04 07:38:29

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

我有以下3个表

来源

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

SourceAccount

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

SOURCEUSER

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

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

  • SiteId(1)
  • AccountId(1)
  • UserId(1)

使用这些参数,查询应返回类似

的内容
SourceId | Name         | Access
---------+--------------+---------
1        | Source 1     | 1
2        | Source 2     | 0

访问列是布尔(位)

因此,本质上查询应该返回属于给定SiteId的给定AccountId的所有源(Id和Name)以及一个布尔告诉我用户是否可以访问它。

关于如何进行的任何想法?

由于

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

 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 个答案:

答案 0 :(得分:3)

试试这个:

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
相关问题