Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Пометить дубликаты : как победить коррелированные запросы? / 25 сообщений из 74, страница 1 из 3
25.05.2004, 13:08
    #32532276
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
Я со своими Update-ами уже весь форум замучил.
Желаю разобраться с коррелированными запросами раз и навсегда. Не далее как вчера была похожая тема Саныча. Но чего-то я в этом вопросе недопонимаю, и каждый раз когда я с этим сталкиваюсь, я убеждаюсь, что я ничего не понимаю. Посему вопрос к тем, кто в этом разбирается - как надо рассуждать при написании коррелированного запроса. И пример задачи, которую я не могу решить (:-()
В таблицу test
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
id	FK	duplicate
 1 	 1 	Нет
 2 	 1 	Да
 3 	 2 	Нет
 4 	 2 	Да
 5 	 1 	Да
 6 	 1 	Нет
 7 	 5 	Нет
 8 	 1 	Нет
 9 	 5 	Нет
 10 	 2 	Нет
начиная с какой-то известной строки вставляются данные ( в данном примере с 6). После вставки надо проставить в поле duplicate флаг в те строки, которые уже проходили ранее по данному FK, т.е в данном примере флаг должен проставиться в соотв. поле строк с id=6,8,9,10
Если кто-то решит эту задачку, большая просьба разъяснить, как этот запрос работает, чтоб разобраться с этим раз и навсегда.
Может еще и ссылку кто даст, где про такие запросы можно почитать.
Спасибо.
Отключаюсь на 2 часа.
...
Рейтинг: 0 / 0
25.05.2004, 13:17
    #32532287
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
Я вот условия не очень понял...
авторПосле вставки надо проставить в поле duplicate флаг в те строки, которые уже проходили ранее по данному FK
Объясни по человечески - это значит, что надо Update-нуть только те строки у которых FK такой-же как и у 6-й строки?
тогда почему такой список... id=6,8,9,10

не догоняю...
...
Рейтинг: 0 / 0
25.05.2004, 13:19
    #32532291
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
ИМХО

Имеется ввиду следующие

Если есть в таблице записи с id меньшим текущей и с равным FK, то ставм "ДА", иначе "НЕТ"

Так понятно?
...
Рейтинг: 0 / 0
25.05.2004, 13:23
    #32532304
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
Код: plaintext
1.
2.
Update test t1 left join test t2 on (t1.id > t2.id) and (t1.fk = t2.fk)
set t1.b = true
where t2.id is not null;

проверил - работает :)
...
Рейтинг: 0 / 0
25.05.2004, 15:14
    #32532672
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
Bely.
paparome очень точно выразил мысль : "Если есть в таблице записи с id меньшим текущей и с равным FK, то ставм "ДА", иначе "НЕТ"
Paramone , красота, действительно этот запрос
Код: plaintext
1.
2.
Update test t1 left join test t2 on (t1.id > t2.id) and (t1.fk = t2.fk)
set t1.duplicate = true
where t2.id is not null;
работает.
Вот только я, жертва графических конструкторов запросов, не понимаю - как. И не понимаю, как надо думать, чтобы его придумать. Если есть у тебя время, объясни, пожалуйста, словами, как он работает и как вообще делать эти коррелированные запросы. Как ты при этом рассуждаешь?
...
Рейтинг: 0 / 0
25.05.2004, 15:19
    #32532682
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
Мысли в слух :)
1)Непонятно, зачем держать дополнительно поле в таблице ( в данном случае -duplicate),не несущее самостоятельного смысла, когда всегда можно получить нужное значение простым (или не очень ) селектом.
2)Если уж возникла крайняя необходимость в таком поле , то лучше его инициализировать во время вставки данных, а не морочить голову апдейтами .
...
Рейтинг: 0 / 0
25.05.2004, 15:28
    #32532704
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
авторВот только я, жертва графических конструкторов запросов, не понимаю - как.

Не пользуйся графическими конструкторами:
- Сначала будет тяжело
- Зато потом, просто (я, например, уже не могу в конструкторе нарисовать, что-то сложнее 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, то наверное быстрее будет и условие не потребуется :) (хотя могет и ругнуться, что запрос не обновляемый :( )

автори как вообще делать эти коррелированные запросы.
коррелированные - я и словьев-то таких не знаю :(
...
Рейтинг: 0 / 0
25.05.2004, 15:39
    #32532743
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
2 Varan
Представь ,что коррелированный запрос - это некая функция ,получающая входные параметры от основного запроса ,и возвращающая результаты работа в основной запрос.
...
Рейтинг: 0 / 0
25.05.2004, 15:44
    #32532764
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
VIG,
Ну, этот "duplicate" не мною придуман, смысл, видимо, в нем есть, хотя, может быть ту же мысль можно и в другой структуре воплотить. Смысл в том, что надо быстро знать, прервая это строка по данному FK или нет. В тех запросах, где эта структура используется, нет возможности это проверять запросом (они и так на пределе), лучше это просто прочитать.
Можно, наверное, и при вставке (кстати, как?), но мне это что-то в последий момент в голову пришло. Но по смыслу будет почти то же самое, что Paramone предложил.
Блин, их же при удалении придется апдейтить еще...:-(. У меня это как-то из головы вылетело.
...
Рейтинг: 0 / 0
25.05.2004, 15:48
    #32532781
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
2 Варан

Да - все глухо :(

А зачем, что-то там запросом насчитывать?

Там где надо проверить, первая это запись или нет пишешь
(DCount("*","test","(id <" & rs("id") & ") and (fk = " & rs("fk") & ")")>0)
Вот и будут твои ДА и НЕТ , только в реальном времени!
...
Рейтинг: 0 / 0
25.05.2004, 15:52
    #32532796
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
paparome, там строк больше 500 тыс, это dcount тормозить будет в риалтайме.
...
Рейтинг: 0 / 0
25.05.2004, 15:56
    #32532812
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
Ага - будет :)
Индексы накрути

А при удалении записи(записей) где-нить в начале таблы (сортирую по id) вам придется пересмотреть всю таблицу ниже (с большими id) удаленных

Думаете не будет тормозить?

А при вставке ...
хотя привставке только один проход по таблице (в любом случае DCount - тоже самое делает)
...
Рейтинг: 0 / 0
25.05.2004, 16:06
    #32532836
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
(c)VIG, Кстати, у Paromone этот запрос и не коррелированный вроде, просто на самообъединении...
Кстати, главная загвоздка, из-за которой я после конструкторов не могу такой запрос составить on (t1.id > t2.id) . Мне б и в голову не пришло такое условие в Join написать. Перетаскивая поля в конструкторе запросов при джойне с одного места на другое, у меня сложился стереотип, что Join выполняется только по равенству, тут же - более сложное условие...
...
Рейтинг: 0 / 0
25.05.2004, 16:13
    #32532865
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
Кстати, с Inner Join тоже работает.
Ладно, пошел запросы изучать.
Мы строили, строили, и, наконец, построили ... :-(
...
Рейтинг: 0 / 0
25.05.2004, 16:13
    #32532867
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
В продолжение темы:
В данном случае ( запросе от paparome) коррелированным запросом и не пахнет.
В запросе есть маленькая ошибка
вместо
Код: plaintext
on (t1.id > t2.id) and (t1.fk = t2.fk)
надо
Код: plaintext
on (t1.id <> t2.id) and (t1.fk = t2.fk)
...
Рейтинг: 0 / 0
25.05.2004, 16:15
    #32532872
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
1. Не надо мой ник перевирать!!
paparome я! (лучше копируй через буфер) :)

2. в качестве условия к join можно писать все что хочешь, но вот представить это в Конструкторе Акс уже не сможет, это ограничение конструктора, а не SQL как такового! (хотя конструктор в MSSQL такие феньки уже понимает :) )
...
Рейтинг: 0 / 0
25.05.2004, 16:18
    #32532882
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
VIG,
У paparome (приношу извинения за ошибку в нике) правильно, вариант on (t1.id <> t2.id) выдает полную чушь.
...
Рейтинг: 0 / 0
25.05.2004, 16:19
    #32532883
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
2 Виг

авторon (t1.id <> t2.id) and (t1.fk = t2.fk)
мотивируй?
Я возражаю :)

авторПосле вставки надо проставить в поле duplicate флаг в те строки, которые уже проходили ранее по данному FK
Проходили ранее (т.е. с меньшим id, но с таким же fk)
А не есть ли еще кроме данной строки еще строки с таким же fk
...
Рейтинг: 0 / 0
25.05.2004, 16:23
    #32532896
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
2 paparome
При t1.id > t2.id не будет апдейтиться запись с минимальным id
...
Рейтинг: 0 / 0
25.05.2004, 16:26
    #32532910
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
авторПри t1.id > t2.id не будет апдейтиться запись с минимальным id
А и не должна :)
Читаем условие задачи внимательнее

Если запись с минимальным id, значит нет записи с таким же FK, но с id меньшим, чем у этой записи!

В чем непонятки?
...
Рейтинг: 0 / 0
25.05.2004, 16:33
    #32532940
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
О!

кстати понял зачем мне left join понадобился (Сапибо Виг :) )

Код: plaintext
1.
Update test t1 left join test t2 on (t1.id > t2.id) and (t1.fk = t2.fk)
set t1.duplicate = iif(isnull(t2.id),false,true);

Это если в поле duplicate полный бардак :)
И при left join все поля будут апдетиться (даже с минимальным id) :)
...
Рейтинг: 0 / 0
25.05.2004, 16:49
    #32532984
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
Ну, хрен редьки не слаще :)
Теперь у тебя запись с минимальным id всегда будет false, даже если для нее есть
дубликаты
...
Рейтинг: 0 / 0
25.05.2004, 16:51
    #32532992
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
Блин, Виг

Да она и должна быть false !!!
...
Рейтинг: 0 / 0
25.05.2004, 16:52
    #32532997
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
См. первый пост
там есть пример как должно быть
первые 5 записей уже правильно, как и остаьным 5 такое сделать?
...
Рейтинг: 0 / 0
25.05.2004, 16:54
    #32533005
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить дубликаты : как победить коррелированные запросы?
Хорошо - переформулирую

Все записи имеющие дубликаты по fk должны быть помечены true, кроме первого вхождения! (первое вхождение = false)

Это условия задачи!
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Пометить дубликаты : как победить коррелированные запросы? / 25 сообщений из 74, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]