|
|
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
Я со своими Update-ами уже весь форум замучил. Желаю разобраться с коррелированными запросами раз и навсегда. Не далее как вчера была похожая тема Саныча. Но чего-то я в этом вопросе недопонимаю, и каждый раз когда я с этим сталкиваюсь, я убеждаюсь, что я ничего не понимаю. Посему вопрос к тем, кто в этом разбирается - как надо рассуждать при написании коррелированного запроса. И пример задачи, которую я не могу решить (:-() В таблицу test Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Если кто-то решит эту задачку, большая просьба разъяснить, как этот запрос работает, чтоб разобраться с этим раз и навсегда. Может еще и ссылку кто даст, где про такие запросы можно почитать. Спасибо. Отключаюсь на 2 часа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 13:08 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
Я вот условия не очень понял... авторПосле вставки надо проставить в поле duplicate флаг в те строки, которые уже проходили ранее по данному FK Объясни по человечески - это значит, что надо Update-нуть только те строки у которых FK такой-же как и у 6-й строки? тогда почему такой список... id=6,8,9,10 не догоняю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 13:17 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
ИМХО Имеется ввиду следующие Если есть в таблице записи с id меньшим текущей и с равным FK, то ставм "ДА", иначе "НЕТ" Так понятно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 13:19 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. проверил - работает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 13:23 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
Bely. paparome очень точно выразил мысль : "Если есть в таблице записи с id меньшим текущей и с равным FK, то ставм "ДА", иначе "НЕТ" Paramone , красота, действительно этот запрос Код: plaintext 1. 2. Вот только я, жертва графических конструкторов запросов, не понимаю - как. И не понимаю, как надо думать, чтобы его придумать. Если есть у тебя время, объясни, пожалуйста, словами, как он работает и как вообще делать эти коррелированные запросы. Как ты при этом рассуждаешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 15:14 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
Мысли в слух :) 1)Непонятно, зачем держать дополнительно поле в таблице ( в данном случае -duplicate),не несущее самостоятельного смысла, когда всегда можно получить нужное значение простым (или не очень ) селектом. 2)Если уж возникла крайняя необходимость в таком поле , то лучше его инициализировать во время вставки данных, а не морочить голову апдейтами . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 15:19 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
авторВот только я, жертва графических конструкторов запросов, не понимаю - как. Не пользуйся графическими конструкторами: - Сначала будет тяжело - Зато потом, просто (я, например, уже не могу в конструкторе нарисовать, что-то сложнее select * from tbl1 :( ) авторИ не понимаю, как надо думать, чтобы его придумать. Я тоже плохо понимаю, как надо думать, чтобы такое придумать :( Вот, например, если в этом запросе поменять left join на inner join, то наверное он не будет работать, а может будет (ну не знаю я :( ) А, вообще, примерно так - выражаешь свою мысль на русском, а потом переводишь в SQL (у меня так) Вот я написал (достаточно точно сформулировал суть поблемы) авторЕсли есть в таблице записи с id меньшим текущей и с равным FK, то ставм "ДА", иначе "НЕТ" И перевел это на SQL: Если есть в таблице записи с id меньшим текущей = (t1.id > t2.id) и = and с равным FK = (t1.fk = t2.fk) то ставм "ДА" = Set t1.duplicate = true кстати - если left заменить на inner, то наверное быстрее будет и условие не потребуется :) (хотя могет и ругнуться, что запрос не обновляемый :( ) автори как вообще делать эти коррелированные запросы. коррелированные - я и словьев-то таких не знаю :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 15:28 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
2 Varan Представь ,что коррелированный запрос - это некая функция ,получающая входные параметры от основного запроса ,и возвращающая результаты работа в основной запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 15:39 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
VIG, Ну, этот "duplicate" не мною придуман, смысл, видимо, в нем есть, хотя, может быть ту же мысль можно и в другой структуре воплотить. Смысл в том, что надо быстро знать, прервая это строка по данному FK или нет. В тех запросах, где эта структура используется, нет возможности это проверять запросом (они и так на пределе), лучше это просто прочитать. Можно, наверное, и при вставке (кстати, как?), но мне это что-то в последий момент в голову пришло. Но по смыслу будет почти то же самое, что Paramone предложил. Блин, их же при удалении придется апдейтить еще...:-(. У меня это как-то из головы вылетело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 15:44 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
2 Варан Да - все глухо :( А зачем, что-то там запросом насчитывать? Там где надо проверить, первая это запись или нет пишешь (DCount("*","test","(id <" & rs("id") & ") and (fk = " & rs("fk") & ")")>0) Вот и будут твои ДА и НЕТ , только в реальном времени! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 15:48 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
paparome, там строк больше 500 тыс, это dcount тормозить будет в риалтайме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 15:52 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
Ага - будет :) Индексы накрути А при удалении записи(записей) где-нить в начале таблы (сортирую по id) вам придется пересмотреть всю таблицу ниже (с большими id) удаленных Думаете не будет тормозить? А при вставке ... хотя привставке только один проход по таблице (в любом случае DCount - тоже самое делает) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 15:56 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
(c)VIG, Кстати, у Paromone этот запрос и не коррелированный вроде, просто на самообъединении... Кстати, главная загвоздка, из-за которой я после конструкторов не могу такой запрос составить on (t1.id > t2.id) . Мне б и в голову не пришло такое условие в Join написать. Перетаскивая поля в конструкторе запросов при джойне с одного места на другое, у меня сложился стереотип, что Join выполняется только по равенству, тут же - более сложное условие... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 16:06 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
Кстати, с Inner Join тоже работает. Ладно, пошел запросы изучать. Мы строили, строили, и, наконец, построили ... :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 16:13 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
В продолжение темы: В данном случае ( запросе от paparome) коррелированным запросом и не пахнет. В запросе есть маленькая ошибка вместо Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 16:13 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
1. Не надо мой ник перевирать!! paparome я! (лучше копируй через буфер) :) 2. в качестве условия к join можно писать все что хочешь, но вот представить это в Конструкторе Акс уже не сможет, это ограничение конструктора, а не SQL как такового! (хотя конструктор в MSSQL такие феньки уже понимает :) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 16:15 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
VIG, У paparome (приношу извинения за ошибку в нике) правильно, вариант on (t1.id <> t2.id) выдает полную чушь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 16:18 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
2 Виг авторon (t1.id <> t2.id) and (t1.fk = t2.fk) мотивируй? Я возражаю :) авторПосле вставки надо проставить в поле duplicate флаг в те строки, которые уже проходили ранее по данному FK Проходили ранее (т.е. с меньшим id, но с таким же fk) А не есть ли еще кроме данной строки еще строки с таким же fk ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 16:19 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
2 paparome При t1.id > t2.id не будет апдейтиться запись с минимальным id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 16:23 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
авторПри t1.id > t2.id не будет апдейтиться запись с минимальным id А и не должна :) Читаем условие задачи внимательнее Если запись с минимальным id, значит нет записи с таким же FK, но с id меньшим, чем у этой записи! В чем непонятки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 16:26 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
О! кстати понял зачем мне left join понадобился (Сапибо Виг :) ) Код: plaintext 1. Это если в поле duplicate полный бардак :) И при left join все поля будут апдетиться (даже с минимальным id) :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 16:33 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
Ну, хрен редьки не слаще :) Теперь у тебя запись с минимальным id всегда будет false, даже если для нее есть дубликаты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 16:49 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
Блин, Виг Да она и должна быть false !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 16:51 |
|
||
|
Пометить дубликаты : как победить коррелированные запросы?
|
|||
|---|---|---|---|
|
#18+
См. первый пост там есть пример как должно быть первые 5 записей уже правильно, как и остаьным 5 такое сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 16:52 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32532883&tid=1674376]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
152ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 435ms |

| 0 / 0 |
