2015-06-04 5 views
1

У меня есть следующие 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 

Столбец доступа является булевым (бит)

Таким образом, по существу запрос должен возвращать все источники (Id и Name), которые являются частью данного AccountId для данного SiteId, а также логическое указание, что пользователь имеет доступ к нему или нет.

Любая идея о том, как действовать?

Благодаря

EDIT: Для записи здесь есть запрос я придумал, но не работает:

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 

Может быть стоит mentionning, что я бегу это на SQL Azure и SQL Server 2012

EDIT 2: Отношения

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

не совсем понятно, как связаны три таблицы, у вас есть четыре источника, каждый из которых относится к счету 1, является заголовком столбца правильно? но я думаю, что вы должны использовать левое внешнее соединение. – RoughPlace

+0

. Что-то не складывается здесь, как источник 1, так и источник 2 связаны с идентификатором сайта 1 и идентификатором учетной записи 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 
+0

@ZoharPeled, я был в режиме редактирования, но thx в любом случае. –

+0

Nevermind, я ошибся OP, а не ваш –

+2

Я продолжаю тратить время на создание sqlfiddles, я должен был сначала начать с запроса: D здесь вы идете, хотя http://sqlfiddle.com/#!3/755a0/2 –

Смежные вопросы