Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с простым запросом


Ренат ©   (2003-12-16 16:08:00) 

есть 2 таблицы a и b

__________ ____________

1 1
2 2
3
4
__________ _____________

как выбрать поля, содержащие 3 и 4 с учетом того, что обе таблицы большого размера (not in, not exists не подходит)?


Ega23   (2003-12-16 17:51:00) [1]


> Запрос с IN, Ega23 © (16.12.03 17:13), пожалуй, самый
> медленный.

Можно ещё медленней придумать :-)


JibSkeart   (2003-12-16 17:39:00) [2]

Ага и еще посмотреть план выполнения :)


Johnmen   (2003-12-16 17:38:00) [3]

>Ренат ©

Вариантов несколько
1. С помощью соединения, NickBat © (16.12.03 16:45)
2. С помощью подзапроса с EXISTS (уже говорили)
3. SELECT A.Column FROM A
WHERE NOT (A.Column = SOME (SELECT B.Column FROM B))


Какой из них быстрее - зависит не только от наличия индексов, Sandman25 © (16.12.03 16:28), но и от содержимого таблиц.
Запрос с IN, Ega23 © (16.12.03 17:13), пожалуй, самый медленный.
Вобщем, проверяй сам...


Sandman25   (2003-12-16 17:28:00) [4]

[7] Ренат © (16.12.03 16:38)
в обеих таблицах?

Нет, только в той, что в Exists.


Ega23   (2003-12-16 17:13:00) [5]

Кстати, а почему not in не подходит:

Select distinct Column1
from a
where Column1 not in
(Select distinct Column1 from b)
?


Ega23   (2003-12-16 17:11:00) [6]


> Твой запрос вернет
> 1
> 2
> 3
> 3
> 4
> 4

Точно. Тогда через join


Johnmen   (2003-12-16 17:08:00) [7]

>Ренат © (16.12.03 16:45)

Это мелочь...:)


NickBat   (2003-12-16 16:45:00) [8]

Такое подойдет? Работает вроде бы быстро.

select
t1.TF,
t1.F1,
t1.F2
from TEST t1
left join test2 t2 on t1.f1=t2.f1
where t2.f1 is null


Ренат   (2003-12-16 16:45:00) [9]

около 10 тыс. в обеих таблицах interbase


Reindeer Moss Eater   (2003-12-16 16:44:00) [10]

Ega23 © (16.12.03 16:41) [8]

> Это чуть меньше, чем в Декартовом произведении обеих таблиц.

А записей сколько? Порядок?


Твой запрос вернет
1
2
3
3
4
4


Ega23   (2003-12-16 16:41:00) [11]


> Это чуть меньше, чем в Декартовом произведении обеих таблиц.

А записей сколько? Порядок?


Ренат   (2003-12-16 16:38:00) [12]

в обеих таблицах?


Sandman25   (2003-12-16 16:37:00) [13]

[4] Ренат © (16.12.03 16:31)

Можно. Если будет индекс по связываемому полю.


Reindeer Moss Eater   (2003-12-16 16:31:00) [14]

select a.Column from a, b
where a.Column<>b.Column

Это что-ли?


Это чуть меньше, чем в Декартовом произведении обеих таблиц.
То есть - не Это.


Ренат   (2003-12-16 16:31:00) [15]


> Почему not exists не подходит ?

а быстрее нельзя?


Sandman25   (2003-12-16 16:28:00) [16]

[2] Johnmen © (16.12.03 16:17)

+ index сделать.


Johnmen   (2003-12-16 16:17:00) [17]

Почему not exists не подходит ?


Ega23   (2003-12-16 16:11:00) [18]

select a.Column from a, b
where a.Column<>b.Column

Это что-ли?


Наверх

Титульная страница Поиск, карта сайта Написать письмо