|
|
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
Братья по разуму! Задача элементарная, вытекает из темы "GROUP BY clause" Сформулировать ее можно так: используя к-либо агрегатную функцию и группировку, как простейшим способом извлечь некоторые поля найденной строки, не входящие в столбцы, по которым осуществляется группировка. table_1 id (primary key) group_id id21 31 82 33 83 32 84 41 95 40 9.... table_2 id_group (PK) description31 "stroka 31"32 "другкая stroka 32"33 "stroka 33"41 "stroka 41".... Цель - извлечь строку (3, 32, 8) из таблицы table_1. В принципе надо связать по ключу с таблицей 2 (group_id -> id_group), но зная table_1.group_id это несложно. ВОПРОС СОСТОИТ В ТОМ, КАК СОБСТВЕННО ПОЛУЧИТЬ group_id ?? Строже говоря, нам даётся id2 (вообще будем группировать, в нижеследующем запросе условие where использовано просто с целью уяснить задачу на примере исходных данных). Дали нам id2. В первой таблице находим строку с максимальным id (PK). Это ПОСЛЕДНЯЯ ВСТАВЛЕННАЯ СТРОКА (автоинкрементный ключ), ее - строку мы и ищем по условию задачи. select t1.id2, max(t1.id) from table_1 t1 where t1.id2 = 8 получаем: 8 | 3 Вопрос: как извлечь все оставшиеся поля из таблицы, в данном случае group_id ? Главный вопрос: можно ли это сделать без подзапросов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2007, 12:00 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
Дедовский способ. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2007, 12:21 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
Решение интересное! Но если свяжем, то работаем уже со строками, уже другая ситуация. В том понимании, что их не сложить, не вычесть. Т.е. результирующий запрос должен вернуть всё же строку из связанной таблицы, а не внешний ключ. Новая версия со строками будет выглядеть так Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2007, 13:27 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
EugeneUraganГлавный вопрос: можно ли это сделать без подзапросов? А почему такое требование? На ANSI SQL это делается именно с подзапросами PS: есть вариант с WHERE group_id in (SELECT max(group_id) .... ) но тогда нельзя будет использовать суммирования по полям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2007, 19:56 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
select t1.id2, t2.description /* , еще разные поля */ from table_1 t1 join table_2 t2 on t1.group_id = t2.id_group where t1.group_id = ( select max(t11.group_id) from table_1 t11 where t11.id2 = t1.id2 ); работает ооооочень долго. Еще добавлю: таблицы содержат больше полей, в Where есть дополнительные условия, которые должны при таком способе прописываться дважды: в основном и в подзапросе. Постановка "без подзапросов" была такой, т.к. вроде бы этот подзапрос и есть та вещь, из-за которой суммарное время выполнения очень большое. Какие пути оптимизации (именно текста запроса)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 11:17 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
EugeneUraganКакие пути оптимизации (именно текста запроса)?Какой сервер БД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 12:15 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
Сервер firebird 1.5. Отличная вещь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 12:37 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
EugeneUraganselect t1.id2, t2.description /* , еще разные поля */ from table_1 t1 join table_2 t2 on t1.group_id = t2.id_group where t1.group_id = ( select max(t11.group_id) from table_1 t11 where t11.id2 = t1.id2 ); ...работает ооооочень долго. В СУБД ЛИНТЕР запрос Код: plaintext 1. 2. 3. -- -------- --- ------ | 3| 32| 8|drugajz stroka32 | отрабатываает очень быстро. Может, я не совсем правильно понял суть запроса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 13:37 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
Ну да, такой запрос не решает поставленную задачу. Тот что я приводил в предыдущем посте, корректен, но медленен. Мы обрабатываем все строки table_1, а не только одну. Пример с восьмеркой я привёл только для того, чтобы было проще понять задачу на конкретном подмножестве. Т.е. используется группировка по id2, просто переписанная через подзапрос. По всем записям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 14:10 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
Посмотрите на план запроса. Тогда, возможно, станет понятно, почему работает медленно. И понятно, как оптимизировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 14:36 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
План иногда нельзя трогать вовсе. Будем считать, что оптимизатор выбирает оптимальный план выполнения. Тут вопрос в SQL. Одну и ту же задачу можно решить разными способами. Я нашёл один, его привёл. Возможно, вы знаете другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 14:46 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
Зависит от задачи: оптимизировать запрос или попытаться решить задачу разными способами. Не факт, что они пересекаются в вашем случае. "План иногда нельзя трогать вовсе. Будем считать, что оптимизатор выбирает оптимальный план выполнения" Будем. Если вы поиграете индексами или подзапросами/временными таблицами, то оптимальным будет совсем другой план. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 15:24 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
К вопросу о плане, в данном случае ситуация такова, что нужно играть именно подзапросами. Давайте поиграем! Ваш ход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 15:28 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
Проводим голосование. Вопрос: запрос Код: plaintext 1. 2. 3. Два варианта ответа: да нет Хотелось бы услышать мнение тысячи человек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 16:27 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
EugeneUragan Мы обрабатываем все строки table_1, а не только одну. Тогда такой вариант: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 16:27 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
EugeneUraganПроводим голосование. Вопрос: запрос Код: plaintext 1. 2. 3. Два варианта ответа: да нет Хотелось бы услышать мнение тысячи человек. Что значит - "оптимален" ? Оптимальнее его вряд ли можно написать. А вот будет ли он работать быстро - нет, не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 16:46 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
EugeneUragan, у вас видимо в мозгах что-то не то творится. Вы объясните задачу в терминах предметной области, а не в виде объяснения функционирования гипотетического выдуманного вами запроса. А то у вас вообще получается какой-то мега-супер авторекурсивный запрос, который, даже если и правильный, вообще не понятно, что и выдает. И скорее всего, у вас просто база какая-то корявая, или от SQL-я вы хотите чего-то не того, что он может и должен делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 16:50 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
И чего было в MySQL кроспостить, если у вас "замечательный сервер Interbase" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 16:51 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
ЮВ - вроде бы еще один отличный вариант. Надо обмозговать. MasterZiv что же Вы такой нетерпеливый! Всё поясню со временем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 16:59 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
EugeneUraganПроводим голосование. Вопрос: запрос Код: plaintext 1. 2. 3. Два варианта ответа: да нет Хотелось бы услышать мнение тысячи человек.Я вам не скажу за всю Одессу... но иногда будет - Да, а иногда будет - Нет зависит от ситуации, данных, индексов и многих других волшебных пузырьков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 17:16 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
ЮВ пишет: > select t1.id, t1.group_id, t1.id2, t2.gdescr > from t1,t2 where t1.group_id=t2.id_group and > t1.id in (select max(t1.id) from t1 group by t1.id2); Ну тут особенно лучше-то не стало. Все равно два полных прохода по таблице t1, один раз, возможно, по индексу. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 17:24 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
EugeneUraganПроводим голосование. Вопрос: запрос Код: plaintext 1. 2. 3. Два варианта ответа: да нет Хотелось бы услышать мнение тысячи человек.Имхо, вопрос бессмысленен без указания СУБД (иногда вплоть до точной ее версии). В некоторых СУБД этот запрос вообще невозможен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 17:40 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
mik, такие СУБД выкинем на помойку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 17:43 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
EugeneUraganmik, такие СУБД выкинем на помойку.Я от такой только в мае этого года избавился. Многие не сделали этого до сих пор, насколько я в курсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 17:56 |
|
||
|
[ANSI SQL] : как сделать такую штукенцию ?
|
|||
|---|---|---|---|
|
#18+
EugeneUragan Вопрос: запрос Во-первых, FB1.5 это не ANSI. С помощью derived tables соединение с агрегатами дело плёвое. Во-вторых, пример ты написал не по условию задачи, там должно быть не Код: plaintext Код: plaintext Не парь всем моск, делай процедурой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2007, 18:55 |
|
||
|
|

start [/forum/topic.php?fid=32&startmsg=34909775&tid=1544203]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 412ms |

| 0 / 0 |
