![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
![]()
Коллеги, не сталкивался ли кто с подобным? Посоветует ли кто, что можно сделать?
Firebird 2.5 Мне надо в некоторой таблице сгруппировать записи по набору полей и для каждой группы получить список ключей записей этой группы (ну и для технического упрощения - любой ключ из этой группы отдельно). Для этого составил такой запрос: Код:
Код:
Результаты вложенного запроса - они, конечно, избыточны для поставленной задачи, убираем (distinct) эту избыточность и смотрим результаты вложенного запроса: Код:
Код:
|
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
![]()
Прошу админов не рассматривать как даблпост (новые аспекты и т.д.). Итак, задача для практического применения решается (не освежил в памяти описание ф-ии list):
Код:
Код:
![]() |
![]() |
![]() |
![]() |
#3 | |
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
![]()
чтобы ответить на твой вопрос - нужно знать хотя бы как выглядят данные без вот этой твоей операции
Цитата:
надо покумекать чо тут можно придумать... наверное придумал если есть возможность построить еще один селект фром, то стОит прикрутить промежуточный селект с расширенной группировкой, которая уберет дубли по ID_ или просто группировку внести внутрь первого запроса и добавить второму и никаких дистинктов Код:
Последний раз редактировалось soleil@mmc; 01.07.2010 в 23:57. |
|
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
![]()
soleil@mmc, это типа глубокомысленно, но не оч осмысленно, так что можно поподробней?
Я вообще-то показал, что внутренний distinct для внутреннего запроса дает ровно то, группировка по чему дала бы ожидаемый и правильный результат. Результат запроса во втором посте совпадает с одним из результатов первого поста и показывает ровно одно - модификация внутреннего поста distinct-ом или сортировкой (а это уж явный признак внутренней ошибки, а не неверности запроса) приводит к неадекватности результатов внешнего (общего) запроса. Конкретный совет - да, ок. Он дает то же, что и вариант с директивой distinct внутри list (о чем я и написал). Вариант - не лучше и не хуже, кроме того - точный ответ на один из моих вопросов. Но остается и вопрос ожидаемого поведения. Я могу ожидать ненужного из-за неверных представлений. Но Ваши соображения мне этой неверности не показали. Более того, скорее неверны именно Ваши соображения. |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
![]()
Правильный результат получается и вот таким запросом (во вложенном запросе перемножаем таблицы без Left Join):
Код:
|
![]() |
![]() |
![]() |
#6 | ||
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
![]()
чтобы говорить о соображениях приведите ддл таблиц и набор тестовых данных (приаттаченную БД увидел тока чичас, но все равно - прицепить ее не к чему)
в первом посте видно что ваша функа Лист() сворачивает еще и дубли, и, скорее всего, если показать данные внутреннего запроса без дистинкта, то их там и будет в том самом кол-ве а дальше вы уже начинаете прикручивать дистинкт не в те места и задаете вопросы не понятно о чем - поиграйтесь дальше - может что-то и станет ясно накидал тестовый примерчик для оракла wm_concat() делает по смыслу то же самое что и ваш list(), я надеюсь внутренний запрос с набором данных в with() Код:
Цитата:
Код:
Цитата:
а) разбирайтесь со своей функой List() - почему она дистинкт не дистинктит? б) работает ли дистинкт во внутренних подзапросах? Последний раз редактировалось soleil@mmc; 02.07.2010 в 12:25. |
||
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
![]()
soleil@mmc, к чему столько апломба, если Вы даже суть вопроса уловили не полностью?
![]() "а дальше вы уже начинаете прикручивать дистинкт не в те места" Почему же не в те? Вполне в те. Исходный вложенный запрос для моих целей избыточен. Он просто перемножает таблицу с самой собой, поэтому каждый ключ в группе повторяется столько раз, сколько в группе членов. В результатах полного исходного запроса списки имеют немного иную повторяемость, потому что я упустил отсечение записей еще по одному полю (а список, которым я заменял параметр - это не совсем полный список ключей), то есть надо было вот так: Код:
Код:
Код:
|
![]() |
![]() |
![]() |
#8 |
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
![]()
а не подскажете в чем заключается гениальная идея умножения таблицы самой на себя в данном случае чтобы вытащить список записей, на которые наложен фильтр по айдишнику (ну и + добавлися по типу)?
раз уж покопали эту задачку, не затруднитесь и прогоните такой запрос на своих данных Код:
Последний раз редактировалось soleil@mmc; 02.07.2010 в 16:41. |
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
![]()
soleil@mmc, да, конечно Вы правы. Просто к list (и к постановке задачи в таком виде) я пришел после нескольких вариантов, и из них притащил лишнее, без чего можно было обойтись.
Upd. Да нет, это я что-то на другое отвлекся. Умножение нужно для того, чтобы выбрать все записи, которые совпадают с указанными по группируемым полям. А в Вашем запросе выбираются только указанные записи. Последний раз редактировалось Антон Ю.Б.; 02.07.2010 в 18:02. |
![]() |
![]() |
![]() |
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Запрос - Группировка | fox77 | Microsoft Office Access | 1 | 23.06.2010 12:46 |
вложенный запрос выборка по многим критериям | Droid | БД в Delphi | 2 | 23.05.2010 19:31 |
Вложенный поиск файлов | kardinal_kdp | Помощь студентам | 2 | 01.03.2010 09:34 |
Запрос в FireBird | Gurt87 | БД в Delphi | 4 | 01.10.2009 19:40 |
не работает вложенный catch | jorjik | Общие вопросы C/C++ | 5 | 13.07.2008 22:37 |