|
Выборка различающихся строк
|
|||
---|---|---|---|
#18+
Есть ли способ для быстрой выборки строк первой таблицы, которых нет во второй? select distinct table1.field1 from table1, table2 where table1.field1 <> table2.field1 что-то уж очень долго работает ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2001, 06:19 |
|
Выборка различающихся строк
|
|||
---|---|---|---|
#18+
Ну, братец, быстродействие еще зависит и от корректного индексирования . Вот вариант запроса, возвращающего аналогичный набор. А работает ли он быстрее - тестируй сам. На сколько я понимаю, должен быть быстрее. select t1.* from table1 t1 LEFT JOIN table2 t2 ON t1.field1=t2.field2 where t2.field2 is null ЗЫ. Не полохо бы иметь индексы по полям t1.field1 и t2.field2. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2001, 10:39 |
|
Выборка различающихся строк
|
|||
---|---|---|---|
#18+
Пардон, индексы надо не иметь, а создать. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2001, 10:49 |
|
Выборка различающихся строк
|
|||
---|---|---|---|
#18+
Можно и так 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2001, 10:53 |
|
Выборка различающихся строк
|
|||
---|---|---|---|
#18+
Можно и так 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2001, 10:55 |
|
Выборка различающихся строк
|
|||
---|---|---|---|
#18+
можно еще так: 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. Скорее всего из-за такой большой выборки запрос и работает так медленно - индексы нужны, но в данном случае они бы не помогли: запрос составлен неправильно, происходит полный перебор всех записей. Так что быстродействие еще зависит и от корректного написания ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2001, 11:01 |
|
|
start [/forum/topic.php?fid=46&fpage=3592&tid=1827412]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 319ms |
total: | 444ms |
0 / 0 |