Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Пометить дубликаты : как победить коррелированные запросы?  [new]
Varan
Member

Откуда:
Сообщений: 1258
Я со своими Update-ами уже весь форум замучил.
Желаю разобраться с коррелированными запросами раз и навсегда. Не далее как вчера была похожая тема Саныча. Но чего-то я в этом вопросе недопонимаю, и каждый раз когда я с этим сталкиваюсь, я убеждаюсь, что я ничего не понимаю. Посему вопрос к тем, кто в этом разбирается - как надо рассуждать при написании коррелированного запроса. И пример задачи, которую я не могу решить (:-()
В таблицу test
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 часа.
25 май 04, 13:08    [698787]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
Bely
Member

Откуда: Москва
Сообщений: 1903
Я вот условия не очень понял...
автор
После вставки надо проставить в поле duplicate флаг в те строки, которые уже проходили ранее по данному FK

Объясни по человечески - это значит, что надо Update-нуть только те строки у которых FK такой-же как и у 6-й строки?
тогда почему такой список... id=6,8,9,10

не догоняю...
25 май 04, 13:17    [698814]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
ИМХО

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

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

Так понятно?
25 май 04, 13:19    [698821]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
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;

проверил - работает :)
25 май 04, 13:23    [698838]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
Varan
Member

Откуда:
Сообщений: 1258
Bely.
paparome очень точно выразил мысль : "Если есть в таблице записи с id меньшим текущей и с равным FK, то ставм "ДА", иначе "НЕТ"
Paramone, красота, действительно этот запрос
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;
работает.
Вот только я, жертва графических конструкторов запросов, не понимаю - как. И не понимаю, как надо думать, чтобы его придумать. Если есть у тебя время, объясни, пожалуйста, словами, как он работает и как вообще делать эти коррелированные запросы. Как ты при этом рассуждаешь?
25 май 04, 15:14    [699364]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
(c)VIG
Member

Откуда:
Сообщений: 1507
Мысли в слух :)
1)Непонятно, зачем держать дополнительно поле в таблице ( в данном случае -duplicate),не несущее самостоятельного смысла, когда всегда можно получить нужное значение простым (или не очень ) селектом.
2)Если уж возникла крайняя необходимость в таком поле , то лучше его инициализировать во время вставки данных, а не морочить голову апдейтами .
25 май 04, 15:19    [699382]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
автор
Вот только я, жертва графических конструкторов запросов, не понимаю - как.


Не пользуйся графическими конструкторами:
- Сначала будет тяжело
- Зато потом, просто (я, например, уже не могу в конструкторе нарисовать, что-то сложнее 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 май 04, 15:28    [699408]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
(c)VIG
Member

Откуда:
Сообщений: 1507
2 Varan
Представь ,что коррелированный запрос - это некая функция ,получающая входные параметры от основного запроса ,и возвращающая результаты работа в основной запрос.
25 май 04, 15:39    [699459]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
Varan
Member

Откуда:
Сообщений: 1258
VIG,
Ну, этот "duplicate" не мною придуман, смысл, видимо, в нем есть, хотя, может быть ту же мысль можно и в другой структуре воплотить. Смысл в том, что надо быстро знать, прервая это строка по данному FK или нет. В тех запросах, где эта структура используется, нет возможности это проверять запросом (они и так на пределе), лучше это просто прочитать.
Можно, наверное, и при вставке (кстати, как?), но мне это что-то в последий момент в голову пришло. Но по смыслу будет почти то же самое, что Paramone предложил.
Блин, их же при удалении придется апдейтить еще...:-(. У меня это как-то из головы вылетело.
25 май 04, 15:44    [699485]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
2 Варан

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

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

Там где надо проверить, первая это запись или нет пишешь
(DCount("*","test","(id <" & rs("id") & ") and (fk = " & rs("fk") & ")")>0)
Вот и будут твои ДА и НЕТ, только в реальном времени!
25 май 04, 15:48    [699508]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
Varan
Member

Откуда:
Сообщений: 1258
paparome, там строк больше 500 тыс, это dcount тормозить будет в риалтайме.
25 май 04, 15:52    [699531]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
Ага - будет :)
Индексы накрути

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

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

А при вставке ...
хотя привставке только один проход по таблице (в любом случае DCount - тоже самое делает)
25 май 04, 15:56    [699558]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
Varan
Member

Откуда:
Сообщений: 1258
(c)VIG, Кстати, у Paromone этот запрос и не коррелированный вроде, просто на самообъединении...
Кстати, главная загвоздка, из-за которой я после конструкторов не могу такой запрос составить on (t1.id > t2.id) . Мне б и в голову не пришло такое условие в Join написать. Перетаскивая поля в конструкторе запросов при джойне с одного места на другое, у меня сложился стереотип, что Join выполняется только по равенству, тут же - более сложное условие...
25 май 04, 16:06    [699597]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
Varan
Member

Откуда:
Сообщений: 1258
Кстати, с Inner Join тоже работает.
Ладно, пошел запросы изучать.
Мы строили, строили, и, наконец, построили ... :-(
25 май 04, 16:13    [699639]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
(c)VIG
Member

Откуда:
Сообщений: 1507
В продолжение темы:
В данном случае ( запросе от paparome) коррелированным запросом и не пахнет.
В запросе есть маленькая ошибка
вместо
on (t1.id > t2.id) and (t1.fk = t2.fk)
надо
on (t1.id <> t2.id) and (t1.fk = t2.fk)
25 май 04, 16:13    [699641]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
1. Не надо мой ник перевирать!!
paparome я! (лучше копируй через буфер) :)

2. в качестве условия к join можно писать все что хочешь, но вот представить это в Конструкторе Акс уже не сможет, это ограничение конструктора, а не SQL как такового! (хотя конструктор в MSSQL такие феньки уже понимает :) )
25 май 04, 16:15    [699648]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
Varan
Member

Откуда:
Сообщений: 1258
VIG,
У paparome (приношу извинения за ошибку в нике) правильно, вариант on (t1.id <> t2.id) выдает полную чушь.
25 май 04, 16:18    [699663]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
2 Виг

автор
on (t1.id <> t2.id) and (t1.fk = t2.fk)

мотивируй?
Я возражаю :)

автор
После вставки надо проставить в поле duplicate флаг в те строки, которые уже проходили ранее по данному FK

Проходили ранее (т.е. с меньшим id, но с таким же fk)
А не есть ли еще кроме данной строки еще строки с таким же fk
25 май 04, 16:19    [699664]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
(c)VIG
Member

Откуда:
Сообщений: 1507
2 paparome
При t1.id > t2.id не будет апдейтиться запись с минимальным id
25 май 04, 16:23    [699685]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
автор
При t1.id > t2.id не будет апдейтиться запись с минимальным id

А и не должна :)
Читаем условие задачи внимательнее

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

В чем непонятки?
25 май 04, 16:26    [699701]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
О!

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

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) :)
25 май 04, 16:33    [699746]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
(c)VIG
Member

Откуда:
Сообщений: 1507
Ну, хрен редьки не слаще :)
Теперь у тебя запись с минимальным id всегда будет false, даже если для нее есть
дубликаты
25 май 04, 16:49    [699819]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
Блин, Виг

Да она и должна быть false!!!
25 май 04, 16:51    [699831]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
См. первый пост
там есть пример как должно быть
первые 5 записей уже правильно, как и остаьным 5 такое сделать?
25 май 04, 16:52    [699837]     Ответить | Цитировать Сообщить модератору
 Re: Пометить дубликаты : как победить коррелированные запросы?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
Хорошо - переформулирую

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

Это условия задачи!
25 май 04, 16:54    [699847]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft Access Ответить