|
|
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Уважаемый ALL Есть две таблицы - с одинаковым полем идентификатором ID. из первой таблицы надо выбрать записи те ID которых отсутствует в другой таблице. Сделал ручками в цикле - но очень хочется одной строчкой через SELECT (у селекта есть операнд in - по вхождению а тут как раз надо наоборот). Помогите!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 11:41 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
NOT IN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 11:42 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Или NOT EXISTS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 11:43 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Спасибо - что то не сообразил что можно так синтаксис писать у Selectа Буду пробовать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 11:54 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Как не кручу получается не совсем то что надо - если операнд not in ставить в условии where - то исключается только текущая запись второй таблицы - если операнд not in ставить в joint condition - то в зависимости от типа join получается такая фигня что заголову берешся. а NOT EXISTS - что то я в фоксе не нашел ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 13:48 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
select a.* from Table1 a where a.ID not in(select b.ID from Table2 b where b.ID=a.ID) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 13:53 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Спасибо AleksMed - Это то что доктор прописал. Тукую конструкцию мне туговато придумать было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 14:06 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Спасибо AleksMed - Это то что доктор прописал. Тукую конструкцию мне туговато придумать было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 14:12 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Hi AleksMed! В данном случае WHERE в подзапросе не нужен :) Это ты видимо из NOT EXISTS случайно загрёб :) Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2005, 04:40 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Hi AleksMed! В данном случае WHERE в подзапросе не нужен :) Это ты видимо из NOT EXISTS случайно загрёб :) Posted via ActualForum NNTP Server 1.2Привет, Игорь! Наверное, в последних версиях VFP действительно не нужен - оптимизация запросов значительно продвинутей стала. В VFP9: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2005, 10:40 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Вот результаты для FPD: С Where 0.511 секунд, без - 0.566 секунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2005, 13:24 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! К Urri - разве в Досовом Фоксе можно Select из Selecta вызывать ? мне кажется вложенные селеkты с 7 визуал фокса появились. к AlexMed & Igor Korolyov - интересен механизм работы вложенного селекта - он получается вызывается из внешнего селекта N раз где N - Количество записей в исходных таблицах ? Хотя по приведенным цифрам - всеравно работает очень быстро. Мне же необходимо было обработать таблицы порядка 100 записей в каждой. Так что такая конструкция как вы предложили - наиболее красиво вписывается в код программы. - не то что я сторонник красивого кода - просто когда это надо в разных местах программы писать - проще 1 строчку вместо целого блока кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 09:50 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
S866Здравствуйте! К Urri - разве в Досовом Фоксе можно Select из Selecta вызывать ? мне кажется вложенные селеkты с 7 визуал фокса появились. Можно! 5 лет работал на FPD 2.6 и этим пользовался... И в Helpе этот прием описан... Только, помнится мне, что это (Select-SQL) было единственное место, где можно было использовать подзапросы... В других командах SQL в FPD такое не допускалось... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 10:03 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
S866К Urri - разве в Досовом Фоксе можно Select из Selecta вызывать ? мне кажется вложенные селеkты с 7 визуал фокса появились.В конструкциях SELECT ... WHERE ... IN (SELECT...) и SELECT ... WHERE EXISTS (SELECT...) - можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 11:19 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Да все точно - у меня в 2.5 - тоже описано. Просто я селекты использовать с VFP 5 начал - там так в Хелпе не заморачиваются. к досовому фоксу справку делали более качественно. И переводили на русский тоже отлично. Не знаете где бы Help под 8-ку или 9-ку найти русский? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 11:21 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 11:28 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 13:33 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Можно и без вложенных селектов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 14:00 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Hi AleksMed! В данном случае WHERE в подзапросе не нужен :) Это ты видимо из NOT EXISTS случайно загрёб :) Posted via ActualForum NNTP Server 1.2 Да в запаре еще и не то напишешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 14:16 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Запустил код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. результаты Вар 1 = 0.352 Вар 2 = 0.621 Вар 3 = 0.781 Быстрее всего Вариант URRI Спасибо всем за отклик Тему наверно можно закрывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 15:40 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Hi Urri! Ну оптимизатор вещь тонкая :) Просто сама суть подзапроса после IN - это выбрать некоторый список, и потом по нему фильтровать - это НЕкоррелированный подзапрос. А если добавить к нему условие связи с "внешней" таблицей - мы получим коррелированный подзапрос - он будет на каждой итерации выбирать всего 1 или 0 записей (логически, на самом деле не совсем так о чём далее.) т.е. по сути не будет отличаться от условия с EXISTS - просто вместо проверки "есть запись" будет выполняться "пустая" проверка "a.id=b.id" - в которой значение имеет не собсвтенно ЧТО сравнивается (это сравнение уже в WHERE прошло), а сам факт - если ли справа хоть что-то или нету :) 2 S866 По поводу оптимизатора на forum.foxclub.ru немного говорил Алексей Цингауз - оказывается даже коррелированные подзапросы в фоксе НЕ "выполняются N раз для N записей основного запроса" а преобразуются в особого рода "соединение"... Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 04:38 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
В VFP6 можно было использовать (в более старших версиях не работает): Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2005, 14:04 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Hi AB! > В VFP6 можно было использовать (в более старших версиях не работает): И это правильно. Потому что это некорректный запрос - сравнение c1.nn#c2.nn в случае отсутствия записи в с2 эквивалентно сравнению c1.nn#.NULL. которое ДОЛЖНО отсекать записи,т.к. оно НЕ является .T. К сожалению обработка NULL значений в таком случае (с внешними соединениями) вплоть до VFP9 работает некорректно (однако с каждой новой версией всё лучше и лучше, как это ни странно :) ) Корректное условие (которое позволит получить правильный результат в VFP8 и старше) выглядит так: .... where (c1.nn<>c2.nn) IS NULL ... Однако на самом деле можно использовать более простое условие (опять таки корректно оно будет работать лишь в VFP8 и старше) .... where c2.nn IS NULL ... Результаты у меня выглядят несколько иначе - выигрывает всегда первый вариант, твой модифицированный вариант идёт вторым (даже если учитывать некорректную работу под VFP7), затем идёт 2 и наконец 3. VFP9 вариант 1 0,550 вариант 2 1,082 вариант 3 1,262 вариант 4 0,751 VFP8SP1 вариант 1 0,571 вариант 2 0,971 вариант 3 1,212 вариант 4 0,681 VFP7SP1 вариант 1 0,461 вариант 2 1,021 вариант 3 1,302 вариант 4 0,551 Вариант select c1.* from c1 where NOT EXIST (select * from c2 where c2.nn=c1.nn) INTO CURSOR cr отрабатывает примерно так-же как и вариант 1 (и с корректностью результата проблем тоже нет). Результаты могут отличаться, если использовать для теста не курсор, а реальные таблицы - уже хотя-бы потому что разные версии фокса по разному строят индексы (VFP7 самые большие делает :) ). Также может влиять то, как создан индекс - ДО заполнения или ПОСЛЕ заполнения таблиц. Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 04:46 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Hi, Igor Korolyov ! Что интересно - результаты тестирования одного и того же варианта статистически - могут отличаться друг от друга! Легко проверить - выполнив подряд раз 10 одно и тоже действие. Различия могут достигать нескольких раз. Видимо влияет и фрагментированность диска, и выполнение Windows каких-то теневых или других процессов на данный момент, фрагментированность памяти и т.п. Обычно самое медленное выполнение - первое. Потом - все нужное уже в памяти, идет быстрее. Поэтому, для лучшей достоверности, наверное, имеет смысл делать измерения в цикле, скажем, до 100, причем после каждого выполнения выгружать все "подвешенное", приводя в начальное состояние. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 12:28 |
|
||
|
Как выбрать записи одной таблицы отсутствующие в другой?
|
|||
|---|---|---|---|
|
#18+
Еще можно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. У меня получилось: вариант 1 0.406000 вариант 2 0.610000 вариант 3 0.812000 вариант 4 0.453000 вариант 5 0.438000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2005, 08:17 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33181965&tid=1590388]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
168ms |
get topic data: |
12ms |
get forum data: |
4ms |
get page messages: |
92ms |
get tp. blocked users: |
2ms |
| others: | 250ms |
| total: | 562ms |

| 0 / 0 |
