Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Непонятки с внешним запросом
|
|||
|---|---|---|---|
|
#18+
ASE 12.5.0.3 Дано - 2 таблицы a и b, связь между ними - по полю с. Простая задача - найти записи в т. a, которых нет в b (по полю c) Так работает правильно, но очень медленно select a.c from a where a.c NOT IN (select c from b) Так работает неправильно, но быстро. select a.c from a, b where a.c*=b.c and b.c is null Почему не правильно - не пойму - этот запрос выбирает ВСЕ записи из таблицы а. Что не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2005, 15:59 |
|
||
|
Непонятки с внешним запросом
|
|||
|---|---|---|---|
|
#18+
А если в первый запрос добавить distinct быстрее работать не будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2005, 16:17 |
|
||
|
Непонятки с внешним запросом
|
|||
|---|---|---|---|
|
#18+
solidА если в первый запрос добавить distinct быстрее работать не будет? и с distinct и без distinct - дождаться терпения не хватает - пришлось прерывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2005, 16:35 |
|
||
|
Непонятки с внешним запросом
|
|||
|---|---|---|---|
|
#18+
solidА если в первый запрос добавить distinct быстрее работать не будет? Во-вторых я хочу понять, почему 1ый запрос неправильно работает - что не так может быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2005, 16:36 |
|
||
|
Непонятки с внешним запросом
|
|||
|---|---|---|---|
|
#18+
если попробовать так select aa.c from a aa where (select count(*) from b bb where bb.c = aa.c) = 0 ну правда, зачем нам из таблички b тащить весь резалтсет (ведь создаст worktable зараза), чтобы в нем искать вхожнение искомого ?! еще лучше чтобы по этом полечку был бы индекс, хотя бы в табличке b ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2005, 19:23 |
|
||
|
Непонятки с внешним запросом
|
|||
|---|---|---|---|
|
#18+
BrutSparkASE 12.5.0.3 Дано - 2 таблицы a и b, связь между ними - по полю с. Простая задача - найти записи в т. a, которых нет в b (по полю c) Так работает правильно, но очень медленно select a.c from a where a.c NOT IN (select c from b) Можно еще select a.c from a where not exists ( select * from b where c = a.c) На счет скорости - нужно чтобы был индекс на c в b. Но и то запрос будет медленный - он же по всей таблице a. BrutSpark Так работает неправильно, но быстро. select a.c from a, b where a.c*=b.c and b.c is null Почему не правильно - не пойму - этот запрос выбирает ВСЕ записи из таблицы а. Что не так? Да, да, да. Вот именно из-за этого и нужны ANSI-OUTER-JOIN-ы. Дело в том, что тут, в старом синтаксисе (TSql outer join) в запросе НЕ ПОНЯТНО, какое поле b.c имеется в виду - ДО соединения (выполнения JOIN-а) таблиц или ПОСЛЕ. А они - разные. ПОСЛЕ это поле может стать "null". Поэтому ASE трактовала эту ситуацию произвольным образом - как решит оптимизатор. Поэтому сделать вычитание таблиц на TSql outer join невозможно. Нужно использовать ANSI-OUTER-JOIN-ы. Код: plaintext 1. 2. 3. Но не надейся что это будет работать существенно быстрее. И строго говоря, запрос неправильный - должно быть Код: plaintext 1. 2. 3. А вот наличие DISTINCT делает этот запрос потенциально работающим медленнее, чем вариант с NOT EXISTS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2005, 21:59 |
|
||
|
Непонятки с внешним запросом
|
|||
|---|---|---|---|
|
#18+
Индексы на с есть и в a, и в b. Поясню, почему в данном случае я не придаю значения distinct - потому что для скорости в т. a были уже предварительно отобраны записи из исходной таблицы именно по distinct. Т.е. в таблице a поле с - на нем индекс - уникальный. А почему not exists будет работать быстрее, чем NOT IN? Про OUTER-JOIN теперь понятно, спасибо. В смысле понятно, что tsql нельзя использовать. Но непонятно, почему " ПОСЛЕ это поле может стать "null" . Ну да ладно. А вообще в help-e все так хорошо расписано именно с where - или help устарел? Еще раз спасибо. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2005, 10:17 |
|
||
|
Непонятки с внешним запросом
|
|||
|---|---|---|---|
|
#18+
А все-ж таки дело в чем-то другом - запрос с left join выдает мне опять ПОЛНОСТЬЮ таблицу a. Вот такой запрос - select distinct a.c --(или a.*) from a left join b on a.c=b.c where b.c is null опять выдает всю a. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2005, 10:34 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=33155737&tid=2013547]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 244ms |
| total: | 407ms |

| 0 / 0 |
