检查子查询中是否存在记录
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
我正在尝试使用以下参数构建查询
- SiteId (1)
- 账户 ID (1)
- UserId (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
我有以下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
我正在尝试使用以下参数构建查询
- SiteId (1)
- 账户 ID (1)
- UserId (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