Инструкция NOT IN и вложенный запрос

Orlic
Дата: 27.09.2005 16:51:14
Access 2000, mdb
Есть запрос, который выводит все записи из таблицы tbo_pokazatel для ПоляСоСписком:
Me.ПоляСоСписком.RowSource = "SELECT tbo_pokazatel.id_pokaz, tbo_sprav_pokazateli.name AS [Наименование показателя], " & _
                                        "tbo_pokazatel.type AS Тип, tbo_sprav_metod.abbr AS Метод, tbo_sprav_ntd.ntd AS НТД " & _
                                        "FROM ((tbo_pokazatel LEFT JOIN tbo_sprav_pokazateli ON tbo_pokazatel.name = tbo_sprav_pokazateli.id_pokaz) " & _
                                        "LEFT JOIN tbo_sprav_ntd ON tbo_pokazatel.ntd = tbo_sprav_ntd.id_ntd) " & _
                                        "LEFT JOIN tbo_sprav_metod ON tbo_pokazatel.metod = tbo_sprav_metod.id_metod " & _
                                        "ORDER BY tbo_sprav_pokazateli.name"

Как сделать так, чтобы выводились только те записи, поле tbo_sprav_pokazateli.name которых еще не фигурировало (отсутствует для данного значения tbo_raschety.id_proba.
Делал так:
Me.ПоляСоСписком.RowSource = "SELECT tbo_pokazatel.id_pokaz, tbo_sprav_pokazateli.name AS [Наименование показателя], " & _
                                        "tbo_pokazatel.type AS Тип, tbo_sprav_metod.abbr AS Метод, tbo_sprav_ntd.ntd AS НТД " & _
                                        "FROM ((tbo_pokazatel LEFT JOIN tbo_sprav_pokazateli " & _
                                        "ON tbo_pokazatel.name = tbo_sprav_pokazateli.id_pokaz) " & _
                                        "LEFT JOIN tbo_sprav_ntd ON tbo_pokazatel.ntd = tbo_sprav_ntd.id_ntd) " & _
                                        "LEFT JOIN tbo_sprav_metod ON tbo_pokazatel.metod = tbo_sprav_metod.id_metod " & _
                                        "WHERE (tbo_sprav_pokazateli.name NOT IN (" & _
                                        "SELECT DISTINCT tbo_sprav_pokazateli.name " & _
                                        "FROM tbo_sprav_pokazateli INNER JOIN (tbo_pokazatel INNER JOIN tbo_raschety " & _
                                        "ON (tbo_pokazatel.id_pokaz = tbo_raschety.id_pokazatel) AND (" & _
                                        "tbo_pokazatel.id_pokaz = tbo_raschety.id_pokazatel)) ON (tbo_sprav_pokazateli.id_pokaz = tbo_pokazatel.name) AND (" & _
                                        "tbo_sprav_pokazateli.id_pokaz = tbo_pokazatel.name) " & _
                                        "WHERE tbo_raschety.id_proba = " & Me.id_proba & "))) " & _
                                        "ORDER BY tbo_sprav_pokazateli.name"
ой мудрено получилось, вряд ли кто то что то поймет.
Короче, смысл такой. Главный Запрос должен вывести несколько полей, среди которых поле NAME, причем это поле NAME должно отсутствовать в результатах вложенного запроса...
Делал уже и NOT LIKE, и NOT EXISTS и чего только не делал...
Кто что понял, подскажите плиз...
ANTIVIR
Дата: 27.09.2005 16:58:00
При беглом осмотре тела, вроде норм...
Не получается что? Выводятся записи которые не долны выводиться?
Скобки не навижу )
Orlic
Дата: 27.09.2005 17:03:14
ANTIVIR
При беглом осмотре тела, вроде норм...
Не получается что? Выводятся записи которые не долны выводиться?
Скобки не навижу )


Да, именно так.
Вот смотри идею. Вложенный запрос возвращает, например, 2 значения - Никель и Водород. По идее в главном запросе конструкция
WHERE (tbo_sprav_pokazateli.name NOT IN (" & _
                                        "SELECT DISTINCT tbo_sprav_pokazateli.name " & _
                                        ..........
Должна замениться на
WHERE (tbo_sprav_pokazateli.name NOT IN ('Никель', 'Водород') 
                                        ..........

То есть условие отбора главного запроса - только те записи, поле tbo_sprav_pokazateli.name которых отсутствует в результатах вложенного запроса...

А у меня выводятся все записи, как будто условия игнорируется просто :-(
Orlic
Дата: 27.09.2005 17:06:13
Вот картинка. На заднем плане этот самый запрос вывел ВСЕ записи, проигнорировав условие отбора NOT IN.
На переднем плане результат работы вложенного в условие запроса.
Как видно из картинки, Никель должен отсутствовать в результатах ЗАПРОСА1.
Konst_One
Дата: 27.09.2005 17:06:45
может вместо DISTINCT лучше сделать GROUP BY
Orlic
Дата: 27.09.2005 17:09:23
Konst_One
может вместо DISTINCT лучше сделать GROUP BY


Нет, это на результат не влияет... То же самое.
ANTIVIR
Дата: 27.09.2005 17:12:36
Orlic

Прислушайтесь к совету Konst_One (не по теме но всеже)

По теме:
Попробуйте вывести 1.подзапрос, 2.запрос с подзапросом и 3.запрос без НОТ ИН
Будет ли разница между 2 и 3 и какая

Странно все это)) Не бывает так,де то запрос наверное не так написан, но без таблиц попробовать не могу)
ANTIVIR
Дата: 27.09.2005 17:13:02
Orlic
Konst_One
может вместо DISTINCT лучше сделать GROUP BY


Нет, это на результат не влияет... То же самое.

Запрос будет быстрее (разницы в результате нет)
Orlic
Дата: 27.09.2005 17:23:22
Ради интереса сделал 2 простые таблички t1 с полями

id1 name
1 Никель
2 Водород
3 Сероводород
4 Аллюминий
5 Ижладабанк
6 Мама
7 Солнце

и t2 с полями

id1 name
6 Мама
7 Солнце

и запустил такой запрос:
SELECT t1.name from t1
where t1.name  NOT IN
(SELECT name from t2)

как и требовалось, получил результат

name
Никель
Водород
Сероводород
Аллюминий
Ижладабанк

Сдается мне, что вся проблема в сложности запроса. Много связываний, условий выборки, а также несоответствие в количестве полей главного и вложенного запросов.
Как думаете?
ANTIVIR
Дата: 27.09.2005 17:26:10
Orlic

Сдается мне, что вся проблема в сложности запроса. Много связываний, условий выборки, а также несоответствие в количестве полей главного и вложенного запросов.
Как думаете?

Я думаю дело не в сложности, а в том что в запросах логическая ошибка, поэтому вы получаете не тот результат который ждете, в не правильности работы самой конструкции НОТ ИН я верю слабо)