Выборка различающихся строк

Brand
Дата: 02.02.2001 06:19:03
Есть ли способ для быстрой выборки строк первой таблицы, которых нет во второй?

select distinct table1.field1
from table1, table2
where table1.field1 <> table2.field1

что-то уж очень долго работает
AnKa
Дата: 02.02.2001 10:39:56
Ну, братец, быстродействие еще зависит и от корректного индексирования . Вот вариант запроса, возвращающего аналогичный набор. А работает ли он быстрее - тестируй сам.
На сколько я понимаю, должен быть быстрее.

select t1.*
from table1 t1 LEFT JOIN table2 t2 ON t1.field1=t2.field2
where t2.field2 is null

ЗЫ. Не полохо бы иметь индексы по полям t1.field1 и t2.field2.
AnKa
Дата: 02.02.2001 10:49:19
Пардон, индексы надо не иметь, а создать.
VadimB
Дата: 02.02.2001 10:53:52
Можно и так
select distinct table1.field1
from table1
where not exists (select * from table2
where table1.field1 = table2.field1)

Более быстрый способ:
Для каждой строки жранить поля с контрольной суммой или на худой конец с длинной поля.
Если проиндексировать поля с контрольной суммой то будет быстрее (индекс меньше)

table1 (field1 varchar,crc1 int)
table2 (field2 varchar,crc2 int)

select distinct table1.field1
from table1
where not exists (select * from table2
where table1.crc = table2.crc2
and table1.field1 = table2.field1) -- прорверка нужна, у разных строк могут совпасть crc
VadimB
Дата: 02.02.2001 10:55:57
Можно и так
select distinct table1.field1
from table1
where not exists (select * from table2
where table1.field1 = table2.field2)
Более быстрый способ:
Для каждой строки жранить поля с контрольной суммой или на худой конец с длинной поля.
Если проиндексировать поля с контрольной суммой то будет быстрее (индекс меньше)

table1 (field1 varchar,crc1 int)
table2 (field2 varchar,crc2 int)

select distinct table1.field1
from table1
where not exists (select * from table2
where table1.crc1 = table2.crc2
and table1.field1 = table2.field2) -- прорверка нужна, у разных строк могут совпасть crc
SergSuper
Дата: 02.02.2001 11:01:21
можно еще так:

select * from table1 t1
where not exists(select * from table2 t2 where t1.field1=t2.field2)

Но ни в коем случае не так:
select distinct table1.field1
from table1, table2
where table1.field1 <> table2.field1
Здесь будут перебраны все возножные сочетания из двух таблиц, кроме тех где эти поля одинаковы.
Т.е. если мы имеет table1 со значениями 2,3,4 и table2 со значениями 4,5, то в результате получим сочетания:
2 4
2 5
3 4
3 5
4 4 ***
4 5
При условии field1 <> field2 не войдет в окончательную выборку только предпоследняя строка. И в итоге мы получим все поля, которые есть в таблице table1. Скорее всего из-за такой большой выборки запрос и работает так медленно - индексы нужны, но в данном случае они бы не помогли: запрос составлен неправильно, происходит полный перебор всех записей.
Так что быстродействие еще зависит и от корректного написания