Помогите с запросом по объединению таблиц

Gentuse
Дата: 16.01.2009 10:54:20
Всем привет.
У меня возникла проблема, на данном этапе я решаю ее при помощи кода, но скорее всего ее реально решить запросом.
У меня есть 2 таблицы:
Таблица: Docs.
Поля в таблице: id, title, text
Таблица: DocGroupRelation
Поля в таблице: id, docId, groupId
В программе надо выводить для открытой группы список всех документов, а те документы, которые принадлежат этой группе пометить. Ну и соответственно, помечая новые документы они будут заноситься в группу.
Я сделал это следующим образом:
1. Создаю запрос на выборку всех документов.
2. Когда открывается группа, я в коде вызываю запрос на выборку из таблицы DocGroupRelation. В коде пробегаюсь по таблице Docs и если нахожу похожий Id в DocGroupRelation, то помечаю ее. И так для каждой группы.
Я новичок в этом деле и никак не могу составить запрос, чтобы все 2 пункта заменить 1 пунктом. т.е. сделать сразу выборку, в которой мне показались бы все документы, и в отдельном поле помечались бы принадлежат ли они данной группе или нет.
Почитал форум, пробовал сделать с left join:
SELECT* FROM Docs LEFT JOIN Docs ON DocGroupRelation.docId = Docs.Id WHERE DocGroupRelation.groupId = @GroupID
тогда он выводит мне только те документы, которые есть в DocGroupRelation.
Может мне кто-нибудь помочь? или данная задача решается только так как я описал вначале?
Заранее спасибо...
Паганель
Дата: 16.01.2009 10:58:46
Приведите, пожалуйста, пример исходных данных и желаемого результата
cyberirbis
Дата: 16.01.2009 10:59:41
Gentuse,

SELECT* FROM Docs LEFT JOIN Docs ON DocGroupRelation.docId = Docs.Id WHERE DocGroupRelation.groupId = @GroupID

тут бы разобраться что с чем джоинится
Docs LEFT JOIN Docs

тоесть что перед джоином и после?
DocGroupRelation или Docs
Gentuse
Дата: 16.01.2009 11:05:38
Паганель,
Вот пример:
Данные в Таблице Docs
id | title | text
1 | Тема дня | text
2 | Договор | text
3 | Сотрудники | text
4 | Статья о Васе | text

Данные в Таблице DocGroupRelation
id | docId | groupId
1 | 1 | g12
2 | 1 | g13
3 | 2 | g12
4 | 4 | g13

результат:
Когда открывается Группа g12:
Тема дня | true
Договор | true
Сотрудники | false
Статья о Васе | false

Когда открывается Группа g13:
Тема дня | true
Договор | false
Сотрудники | false
Статья о Васе | true
Gentuse
Дата: 16.01.2009 11:06:51
Простите, ошибся в сообщении. Вот такой запрос:

SELECT* FROM Docs LEFT JOIN DocGroupRelation ON DocGroupRelation.docId = Docs.Id WHERE
DocGroupRelation.groupId = @GroupID
cyberirbis
Дата: 16.01.2009 11:10:54
Gentuse
Простите, ошибся в сообщении. Вот такой запрос:

SELECT* FROM Docs LEFT JOIN DocGroupRelation ON DocGroupRelation.docId = Docs.Id WHERE
DocGroupRelation.groupId = @GroupID


выбирает только то что есть в DocGroupRelation потому что есть условие по полю этой таблицы
WHERE DocGroupRelation.groupId = @GroupID

я не уверен но стоит проерить такое:
SELECT* FROM Docs LEFT JOIN DocGroupRelation ON DocGroupRelation.docId = Docs.Id AND 
DocGroupRelation.groupId = @GroupID
vino
Дата: 16.01.2009 11:12:03
Gentuse,

SELECT* FROM Docs LEFT JOIN DocGroupRelation ON DocGroupRelation.docId = Docs.Id WHERE 
(DocGroupRelation.groupId = @GroupID) or (DocGroupRelation.groupId is NULL)
Паганель
Дата: 16.01.2009 11:17:15
declare @docs table(id int, title varchar(20), [text] varchar(20))
insert into @docs(id, title, [text])
select 1, 'Тема дня',      'text' union all
select 2, 'Договор',       'text' union all
select 3, 'Сотрудники',    'text' union all
select 4, 'Статья о Васе', 'text'

declare @doc_group_relation table(id int, doc_id int, group_id varchar(10))
insert into @doc_group_relation(id, doc_id, group_id)
select 1, 1, 'g12' union all
select 2, 1, 'g13' union all
select 3, 2, 'g12' union all
select 4, 4, 'g13'

select title
      ,case when exists (select 1
                           from @doc_group_relation as r
                          where r.doc_id = d.id
                            and group_id = 'g12')
            then 'true'
            else 'false'
        end as flag                         
  from @docs as d

title                flag
-------------------- -----
Тема дня             true
Договор              true
Сотрудники           false
Статья о Васе        false

(4 row(s) affected)
Gentuse
Дата: 16.01.2009 11:34:28
cyberirbis,

Спасибо, так вроде все работает. Показывает.

vino,

Выводит только две записи, те что есть в таблице DocGroupRelation

Паганель,
А что означает "Select 1 from"?
cyberirbis
Дата: 16.01.2009 11:37:17
Gentuse

Паганель,
А что означает "Select 1 from"?


проверка на наличие записей по запросу, чтобы в подзапрос не выводить все поля выводим только одно значение