Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Вывод неповторяющихся значений в отдельный столбец. - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: китин, _Boroda_  
Вывод неповторяющихся значений в отдельный столбец.
ikki Дата: Понедельник, 07.01.2013, 22:04 | Сообщение № 21
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
пс. ой wacko
я дико извиняюсь - конечно, любой желающий и знающий может отвечать на последний вопрос.
smile


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениепс. ой wacko
я дико извиняюсь - конечно, любой желающий и знающий может отвечать на последний вопрос.
smile

Автор - ikki
Дата добавления - 07.01.2013 в 22:04
Gustav Дата: Понедельник, 07.01.2013, 23:24 | Сообщение № 22
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Гы-гы! А я тем временем готовился... Я же тоже начал с этого варианта с 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.

Несколько ссылок с понравившимися цитатами:

http://hiprog.com/index.p....emid=35
Цитата
NOT IN – это проверка среди списка значений. Поэтому после выполнения подзапроса должно произойти сравнение указанного в главном запросе поля с этим полученным списком. Причем, раз стоит условие NOT IN, значит, проверить на несовпадение надо ВСЕ значения из списка.


http://firebird.1100200.n4.nabble.com/not-in-select-c-td1250529.html
Цитата
о том что не стоит писать конструкции типа where xxx in (select xxx from
yyy where ...)а нужно их джоинить знают уже наверное все


http://www.nsc.ru/win/docs/db/sql/sql25.htm
Цитата
9. Раздел WHERE является критическим.

Для следующих примеров раздела WHERE индексный путь доступа не будет использоваться, даже если индекс существует (COL1 и COL2 - столбцы одной таблицы, и создан индекс на COL1):
...
COL1 NOT IN (value1, value2)
...


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Понедельник, 07.01.2013, 23:45
 
Ответить
СообщениеГы-гы! А я тем временем готовился... Я же тоже начал с этого варианта с 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.

Несколько ссылок с понравившимися цитатами:

http://hiprog.com/index.p....emid=35
Цитата
NOT IN – это проверка среди списка значений. Поэтому после выполнения подзапроса должно произойти сравнение указанного в главном запросе поля с этим полученным списком. Причем, раз стоит условие NOT IN, значит, проверить на несовпадение надо ВСЕ значения из списка.


http://firebird.1100200.n4.nabble.com/not-in-select-c-td1250529.html
Цитата
о том что не стоит писать конструкции типа where xxx in (select xxx from
yyy where ...)а нужно их джоинить знают уже наверное все


http://www.nsc.ru/win/docs/db/sql/sql25.htm
Цитата
9. Раздел WHERE является критическим.

Для следующих примеров раздела WHERE индексный путь доступа не будет использоваться, даже если индекс существует (COL1 и COL2 - столбцы одной таблицы, и создан индекс на COL1):
...
COL1 NOT IN (value1, value2)
...

Автор - Gustav
Дата добавления - 07.01.2013 в 23:24
ikki Дата: Вторник, 08.01.2013, 00:00 | Сообщение № 23
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
по поводу F1 в скобках - у меня всё правильно, т.к. указан диапазон-ячеек, а не лист tongue

всё остальное... мда... не зря, однако, кукбуки пишут smile
в общем, спасибо большое.
видимо, придётся копать глубже - на одной булевой логике далеко не уедешь.

пс. для подзапросов ещё предикат EXISTS есть... можно попробовать покрутить... но, видимо. быстрее джойна ничего уже не будет.


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениепо поводу F1 в скобках - у меня всё правильно, т.к. указан диапазон-ячеек, а не лист tongue

всё остальное... мда... не зря, однако, кукбуки пишут smile
в общем, спасибо большое.
видимо, придётся копать глубже - на одной булевой логике далеко не уедешь.

пс. для подзапросов ещё предикат EXISTS есть... можно попробовать покрутить... но, видимо. быстрее джойна ничего уже не будет.

Автор - ikki
Дата добавления - 08.01.2013 в 00:00
Gustav Дата: Вторник, 08.01.2013, 00:08 | Сообщение № 24
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Цитата (ikki)
по поводу F1 в скобках - у меня всё правильно

согласен smile


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Цитата (ikki)
по поводу F1 в скобках - у меня всё правильно

согласен smile

Автор - Gustav
Дата добавления - 08.01.2013 в 00:08
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!