Наружное соединение на 3 стола - PullRequest
0 голосов
/ 07 марта 2012

У меня есть 3 таблицы, Client, Tool и ClientTools. Один клиент может иметь несколько инструментов, поэтому ClientTools действует как сводная таблица (содержит только идентификаторы).

Я бы хотел, чтобы для данного Клиента был полный список инструментов и флаг, указывающий, есть ли у Клиента этот инструмент или нет.

Куда я пришел так далеко:

select      t.Id as [ToolId],
            t.Name as [ToolName],
            Cast(case when c.Id is NULL then 0 else 1 end as bit) as [HasThisTool],
from        Tool t
Left join   ClientTools ct
on          t.Id = ct.ToolId
Left Join   Client c
on          ct.ClientId = c.Id

Что правильно дает мне все Инструменты, но для всех Клиентов (дублирование строк Инструмента, когда этот Инструмент принадлежит нескольким клиентам).

Но как только я использую метод close рядом с фильтром для выбранного клиента, мой запрос возвращает только строки для этого клиента (поэтому левое соединение больше не выполняется).

Я пытался добавить where c.Id = 123 а также where (c.Id = 123 or c.Id is null) но никто не работал.

Чего мне не хватает?

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 07 марта 2012

Попробуйте:

select      t.Id as [ToolId],
            t.Name as [ToolName],
            Cast(case when ct.Id is NULL then 0 else 1 end as bit) as [HasThisTool]
from        Tool t
Left join   ClientTools ct
on          t.Id = ct.ToolId and ct.ClientId = @ClientId
1 голос
/ 07 марта 2012

В вашем запросе, если вы не получаете имя своего клиента, вам не нужно присоединяться к этой таблице (но это не настоящая проблема).Попробуйте это:

select      t.Id as [ToolId],
            t.Name as [ToolName],
            Cast(case when ct.Id is NULL then 0 else 1 end as bit) as [HasThisTool]
from        Tool t
Left join   (SELECT * FROM ClientTools WHERE ClientId = @ClientId) ct
on          t.Id = ct.ToolId
0 голосов
/ 07 марта 2012

Если вы измените порядок ваших столов, он должен работать:

select      t.Id as [ToolId],
            t.Name as [ToolName],
            Cast(case when t.Id is NULL then 0 else 1 end as bit) as [HasThisTool],
from        Client c
Left join   ClientTools ct
on          c.Id = ct.ClientId
Left Join   Tool t
on          ct.ToolId = t.Id
where       c.id = 123

По сути, вы говорите, что клиент (а не инструмент) - это то, что определяет, появится ли строка в наборе результатов или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...