Запрос на отсутствующие записи в таблице многие ко многим

Студент_4_курса
Дата: 05.11.2009 10:32:09
Здравствуйте господа :-) Помогите пожалуйста составить запрос такого характера:
есть 3 таблицы - ТЕХНИКА, ТИПЫ РЕМОНТОВ, ПРОВЕДЁННЫЕ РЕМОНТЫ
Ключевые поля ID ТЕХНИКИ и ID РЕМОНТА.
ТЕХНИКА и ТИПЫ РЕМОНТОВ связаны через таблицу ПРОВЕДЁННЫЕ РЕМОНТЫ (связь многие ко многим)

Как составить запрос, чтобы для каждого отдельного ID ТЕХНИКИ выводился список отсутствующих для него ремонтов в таблице ПРОВЕДЁННЫЕ РЕМОНТЫ?

Помогите пожалуйста :-)
Благодарю за внимание!
отакота
Дата: 05.11.2009 10:43:29
Студент_4_курса
Здравствуйте господа :-) Помогите пожалуйста составить запрос такого характера:
есть 3 таблицы - ТЕХНИКА, ТИПЫ РЕМОНТОВ, ПРОВЕДЁННЫЕ РЕМОНТЫ
Ключевые поля ID ТЕХНИКИ и ID РЕМОНТА.
ТЕХНИКА и ТИПЫ РЕМОНТОВ связаны через таблицу ПРОВЕДЁННЫЕ РЕМОНТЫ (связь многие ко многим)

Как составить запрос, чтобы для каждого отдельного ID ТЕХНИКИ выводился список отсутствующих для него ремонтов в таблице ПРОВЕДЁННЫЕ РЕМОНТЫ?

Помогите пожалуйста :-)
Благодарю за внимание!
имеется ввиду - отсутствующих ТИПОВ ремонтов?

Например, так: декартово произведение двух таблиц даст вам теоретически полный набор ключей для таблицы ПРОВЕДЁННЫЕ РЕМОНТЫ, и затем вычитанием оттуда реального списка ключей вы и получите искомые (отсутсвующие) записи - это left join вышеуказанного запроса с таблицей ПРОВЕДЁННЫЕ РЕМОНТЫ по двум полям этой таблицы и условием IS NULL для любого из них.
Студент_4_курса
Дата: 05.11.2009 11:02:16
автор
имеется ввиду - отсутствующих ТИПОВ ремонтов?

Да, оно самое

Благодарю за вашу подсказку, буду разбираться :)
Студент_4_курса
Дата: 05.11.2009 11:05:25
Не совсем понятно как для двух полей использовать IS NULL?
Снабдите пожалуйста примерчиком, если есть под рукой :)
Благодарю за внимание!
отакота
Дата: 05.11.2009 11:10:00
Студент_4_курса
Не совсем понятно как для двух полей использовать IS NULL?
Снабдите пожалуйста примерчиком, если есть под рукой :)
Благодарю за внимание!
так а не надо для двух, достаточно для одного любого. у вас же поля ID ТЕХНИКИ и ID РЕМОНТА в таблице ПРОВЕДЁННЫЕ РЕМОНТЫ, как минимум, обязательны должны быть (а если нет, то такие "неполные" записи надо отбросить еще ДО join'а, ибо они никакой полезной информации для решения задачи не несут)
Rivkin Dmitry
Дата: 05.11.2009 11:27:13
Студент_4_курса,

Можно и так:
select *
from [ТЕХНИКА]
where [ID ТЕХНИКИ] NOT IN (select [ID ТЕХНИКИ] from [ПРОВЕДЁННЫЕ РЕМОНТЫ])

В смысле: показать все записи из табл. ТЕХНИКА, которые не встречаются в таблице ПРОВЕДЁННЫЕ РЕМОНТЫ
Студент_4_курса
Дата: 05.11.2009 23:44:18
Благодарю Вас граждане за помощь! Всё получилось!
Вот два запроса:
1) запрос получающий декартово произведение таблиц (назвал для другого запроса [ВСЕ РЕМОНТЫ])
SELECT [ТЕХНИКА].[ID ТЕХНИКИ], [ТИПЫ РЕМОНТОВ].[ID РЕМОНТА]
FROM [ТЕХНИКА], [ТИПЫ РЕМОНТОВ];

2) собственно нужный результат
SELECT [ВСЕ РЕМОНТЫ].*
FROM [ВСЕ РЕМОНТЫ] LEFT JOIN [ПРОВЕДЁННЫЕ РЕМОНТЫ] ON ([ВСЕ РЕМОНТЫ].[ID ТЕХНИКИ]=[ПРОВЕДЁННЫЕ РЕМОНТЫ].[ID ТЕХНИКИ]) AND ([ВСЕ РЕМОНТЫ].[ID РЕМОНТА]=[ПРОВЕДЁННЫЕ РЕМОНТЫ].[ID РЕМОНТА])
WHERE [ПРОВЕДЁННЫЕ РЕМОНТЫ].[ID РЕМОНТА] IS NULL;

P.S.: как склепать один запрос из этих двух так и не въехал :D

Ещё раз кланяюсь, и благодарю Ваc за помощь!
так наверна
Дата: 05.11.2009 23:52:43
автор

P.S.: как склепать один запрос из этих двух так и не въехал :D


SELECT [ВСЕ РЕМОНТЫ].*
FROM 
(SELECT [ТЕХНИКА].[ID ТЕХНИКИ], [ТИПЫ РЕМОНТОВ].[ID РЕМОНТА]
 FROM [ТЕХНИКА], [ТИПЫ РЕМОНТОВ]) As [ВСЕ РЕМОНТЫ]
LEFT JOIN [ПРОВЕДЁННЫЕ РЕМОНТЫ] 
  ON     ([ВСЕ РЕМОНТЫ].[ID ТЕХНИКИ]=[ПРОВЕДЁННЫЕ РЕМОНТЫ].[ID ТЕХНИКИ]) 
     AND ([ВСЕ РЕМОНТЫ].[ID РЕМОНТА]=[ПРОВЕДЁННЫЕ РЕМОНТЫ].[ID РЕМОНТА])
WHERE [ПРОВЕДЁННЫЕ РЕМОНТЫ].[ID РЕМОНТА] IS NULL;
Студент_4_курса
Дата: 06.11.2009 12:02:06
так наверна,
Благодарю, и кланяюсь Вам в ноги! Всё работает на превосходно! :D