Гы-гы! А я тем временем готовился... Я же тоже начал с этого варианта с Not In:
[vba]
Код
SELECT a.F1 FROM [Лист1$] AS a WHERE a.F1 Not In (SELECT b.F2 FROM [Лист1$] AS b)
[/vba]
Он был очень долог уже в Access (я там пеку запросы - там удобнее, а потом в Excel причесываю), а в Excel я тоже не дождался. Кстати, обращаю внимание, что в скобках надо b.F2, а не b.F1. Но в данном случае с точки зрения быстродействия это не важно - во всех случаях долго.
Интересно, что если убрать Not, то запрос, хотя он нам такой и не нужен, выполняется вполне шустро (как с JOIN).
Полистал Джо Селко и в двух словах вынес примерно следующее (как я понял): * Конструкция In (SELECT...) для текущего проверяемого значения (слева от In) прекращает перебор списка в скобках как только будет найдено первое совпадение, и далее проверяется следующее значение слева. * Конструкция Not In (SELECT...) для текущего проверяемого значения должна проверить на неравенство все значения из подзапроса (из списка в скобках). Т.е. получается, что фактически для всех значений слева будет выполнен полный перебор всех значений справа (как при декартовом произведении), что естественно долго.
Почему SQL в случае Not In не хочет остановиться после того, как будет найдено совпадение слева и справа и (в отличие от In) уже НЕ ВКЛЮЧАТЬ это значение в окончательный список - я не знаю, это вопрос к производителям движков SQL.
NOT IN – это проверка среди списка значений. Поэтому после выполнения подзапроса должно произойти сравнение указанного в главном запросе поля с этим полученным списком. Причем, раз стоит условие NOT IN, значит, проверить на несовпадение надо ВСЕ значения из списка.
Для следующих примеров раздела WHERE индексный путь доступа не будет использоваться, даже если индекс существует (COL1 и COL2 - столбцы одной таблицы, и создан индекс на COL1): ... COL1 NOT IN (value1, value2) ...
Гы-гы! А я тем временем готовился... Я же тоже начал с этого варианта с Not In:
[vba]
Код
SELECT a.F1 FROM [Лист1$] AS a WHERE a.F1 Not In (SELECT b.F2 FROM [Лист1$] AS b)
[/vba]
Он был очень долог уже в Access (я там пеку запросы - там удобнее, а потом в Excel причесываю), а в Excel я тоже не дождался. Кстати, обращаю внимание, что в скобках надо b.F2, а не b.F1. Но в данном случае с точки зрения быстродействия это не важно - во всех случаях долго.
Интересно, что если убрать Not, то запрос, хотя он нам такой и не нужен, выполняется вполне шустро (как с JOIN).
Полистал Джо Селко и в двух словах вынес примерно следующее (как я понял): * Конструкция In (SELECT...) для текущего проверяемого значения (слева от In) прекращает перебор списка в скобках как только будет найдено первое совпадение, и далее проверяется следующее значение слева. * Конструкция Not In (SELECT...) для текущего проверяемого значения должна проверить на неравенство все значения из подзапроса (из списка в скобках). Т.е. получается, что фактически для всех значений слева будет выполнен полный перебор всех значений справа (как при декартовом произведении), что естественно долго.
Почему SQL в случае Not In не хочет остановиться после того, как будет найдено совпадение слева и справа и (в отличие от In) уже НЕ ВКЛЮЧАТЬ это значение в окончательный список - я не знаю, это вопрос к производителям движков SQL.
NOT IN – это проверка среди списка значений. Поэтому после выполнения подзапроса должно произойти сравнение указанного в главном запросе поля с этим полученным списком. Причем, раз стоит условие NOT IN, значит, проверить на несовпадение надо ВСЕ значения из списка.
Для следующих примеров раздела WHERE индексный путь доступа не будет использоваться, даже если индекс существует (COL1 и COL2 - столбцы одной таблицы, и создан индекс на COL1): ... COL1 NOT IN (value1, value2) ...
по поводу F1 в скобках - у меня всё правильно, т.к. указан диапазон-ячеек, а не лист
всё остальное... мда... не зря, однако, кукбуки пишут в общем, спасибо большое. видимо, придётся копать глубже - на одной булевой логике далеко не уедешь.
пс. для подзапросов ещё предикат EXISTS есть... можно попробовать покрутить... но, видимо. быстрее джойна ничего уже не будет.
по поводу F1 в скобках - у меня всё правильно, т.к. указан диапазон-ячеек, а не лист
всё остальное... мда... не зря, однако, кукбуки пишут в общем, спасибо большое. видимо, придётся копать глубже - на одной булевой логике далеко не уедешь.
пс. для подзапросов ещё предикат EXISTS есть... можно попробовать покрутить... но, видимо. быстрее джойна ничего уже не будет.ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki