Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
Вниманию SQL-гуру предлагается недавно встретившаяся в жизни задачка. Дано 2 таблицы create table t1 (col1 int, col2 int, primary key col1); create table t2 (col1 int, col2 int, primary key col1); insert into t1 (1, 1); insert into t1 (1, 2); insert into t1 (2, 2); insert into t2 (2, 2); insert into t2 (3, 1); Требуется : получить таблицу t3, состоящую из всех встреченных ключей и сумм по этим ключам. Т.е. результат должен быть col1 sum(col2) 1 3 2 4 3 1 Чем универсальней (в плане СУБД) тем лучше. Свое решение опубликую позже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 23:56 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
На первый взгляд ничего, кроме GROUP BY по UNION, не требуется. В чем подвох ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2005, 00:11 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
еще интересно что за primary key такой если можно несколько одинаковых значений в таблицу t1 внести. какая-то неудачная задачка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2005, 00:16 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
Rolloчто за primary key такой если можно несколько одинаковых значений в таблицу t1 внести.Угу... Существенное замечание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2005, 00:36 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
Вроде ChA все уже сказал. Примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2005, 09:14 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
Задачка действительно нетрудная. Я бы сказал рутинная. mir сделал селектом по селекту, но это непринципиально. Если конкретный сервер этого не поддерживает, то всегда можно сделать через временные таблицы. А в моем варианте буковок больше! Код: plaintext 1. 2. 3. Однако по теме форума. Таких одинаковых таблиц в базе быть не должно. Чем они отличаются? Названием? Если это данные разных операций, то лучше ввести еще одно поле - признак операции table t ( Operation int, col1 int, col2 int ) ================== Уважаемы господа! Время от времени у всех нас получаются интересные запросы. Может быть стоит завести топик - "Золотая коллекция запросов"? Не задачки задавать, а просто делится опытом. У меня сечас как-раз есть один забавный SELECT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2005, 13:12 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
select from (select..) не понимает уйма баз. И хотелось бы обойтись без временных таблиц. Anyone ? PS: В условии неточность - конечно,col1 не primary key и даже не unique. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2005, 23:05 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
vybegalloselect from (select..) не понимает уйма баз. И хотелось бы обойтись без временных таблиц. Anyone ?Баз = СУБД ? Так view-то на UNION ALL что мешает сделать, это-то практически все СУБД понимают ? А потом выборка из него с группировкой, полагаю, что это самый практичный вариант. Наверняка, вариант, который Вы можете предложить, будет намного дороже в смысле выполнения сервером. Можно такой вариант Код: plaintext 1. 2. 3. 4. 5. 6. 7. P.S. Чесслово, суть вопроса понятней не стала, точнее даже, смысл универсальности. Наверняка, за счет вопиющей неоптимальности... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 01:57 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
ChA vybegalloselect from (select..) не понимает уйма баз. И хотелось бы обойтись без временных таблиц. Anyone ?Баз = СУБД ? Так view-то на UNION ALL что мешает сделать, это-то практически все СУБД понимают ? А потом выборка из него с группировкой, полагаю, что это самый практичный вариант. Наверняка, вариант, который Вы можете предложить, будет намного дороже в смысле выполнения сервером. Можно такой вариант Код: plaintext 1. 2. 3. 4. 5. 6. 7. P.S. Чесслово, суть вопроса понятней не стала, точнее даже, смысл универсальности. Наверняка, за счет вопиющей неоптимальности... 1> SELECT col1, SUM(col2) + (SELECT SUM(t2.col2) FROM t2 WHERE t2.col1 = t1.col1) FROM t1 2> 3> ; Msg 21, Level 14, State 0: ASA Error -1005004: Subqueries are allowed only as arguments of comparisons, IN, and EXISTS Subquery SELECT/UNION at line: 1, -- (df_Heap.cxx 4753) Sybase IQ er 12.5 Try again... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 03:30 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
Кстати, я бы поострегся делать выводы об оптимальности-неоптимальности запросов без привязки к конкретной СУБД. Например, нынче я работаю с такой экзотической вещью как Sybase IQ, которая хранит таблицы по столбцам. В результате чего все понятия об оптимизации становятся с ног на голову. К примеру, приходится избавляться от view вида SELECT * ..., потому что цена выборки зависит от числа столбцов в результате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 03:35 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
vybegalloКстати, я бы поострегся делать выводы об оптимальности-неоптимальности запросов без привязки к конкретной СУБД. Например, нынче я работаю с такой экзотической вещью как Sybase IQ, которая хранит таблицы по столбцам. В результате чего все понятия об оптимизации становятся с ног на голову. К примеру, приходится избавляться от view вида SELECT * ..., потому что цена выборки зависит от числа столбцов в результате.Тоже кстати... Тот факт, что СУБД хранит таблицы по столбцам, вовсе не обязательно влечет какую-то особенную зависимость цены выборки от числа столбцов в результате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 09:36 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 10:32 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
авторMsg 21, Level 14, State 0: ASA Error -1005004: Subqueries are allowed only as arguments of comparisons, IN, and EXISTS Subquery SELECT/UNION at line: 1, -- (df_Heap.cxx 4753) ASA отлично справится с запросом, предложенным mir ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 12:09 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
2 daw Респект. Я сходу до этого не допер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 13:51 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
vybegalloPRIMARY KEY(col1, col2) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 14:17 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
daw Код: plaintext 1. 2. 3. 4. $ ./myisql 1> select isnull(t1.col1, t2.col1), isnull(sum(t1.col2), 0) + isnull(sum(t2.col2), 0) from t1 full outer join t2 on 1 = 0 group by isnull(t1.col1, t2.col1) ; isnull(t1.col1,t2.col1) isnull(sum(t1.col2),0)+isnull( ----------------------- ------------------------------ (0 rows affected) НО если переделать JOIN на t1.col1 = t2.col1 то все работает : 1> select isnull(t1.col1, t2.col1), isnull(sum(t1.col2), 0) + isnull(sum(t2.col2), 0) from t1 full outer join t2 on t1.col1 = t2.col1 group by isnull(t1.col1, t2.col1) isnull(t1.col1,t2.col1) isnull(sum(t1.col2),0)+isnull( ----------------------- ------------------------------ 2 4 1 3 3 1 (3 rows affected) Ну и по поводу цены выборки в СУБД с постолбцовым расположением данных. Дано : таблица из 2 колонок, 1M записей, каждая колонка 100 байт. Требуется : определить X1 - число прочитанных с диска байт для случая select col1 from t1 и X2 - для случая select col1, col2 from t1. Бонус и премия Филдса уходят тому, кто докажет X1 = X2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 22:54 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
funikovyuri авторMsg 21, Level 14, State 0: ASA Error -1005004: Subqueries are allowed only as arguments of comparisons, IN, and EXISTS Subquery SELECT/UNION at line: 1, -- (df_Heap.cxx 4753) ASA отлично справится с запросом, предложенным mir А IQ ни асилил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 23:06 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
vybegalloКстати, я бы поострегся делать выводы об оптимальности-неоптимальности запросов без привязки к конкретной СУБД.Ваше право, но Вы-то пытаетесь решить единым запросом на большинстве СУБД, а не на одной конкретной. Или Вы уверены, что Ваш запрос будет одинаково оптимален для всех ? С нетерпением ожидаю его опубликования... vybegalloКакой ответ будет на вопрос ? Кстати, Ваша модификация варианта-daw на t1.col1 = t2.col1 фактически приводит его к варианту-Cat2 , что может привести к неправильному ответу при других исходных данных. Надеюсь, понятно при каких ? Тем не менее, вариант-daw вполне рабочий и, с теоретической точки зрения, абсолютно верный для всех СУБД, правильно понимающих FULL JOIN, но MySQL(?) просто неправильно его обрабатывает. Т.е., надо еще учитывать, что некоторые СУБД могут не только не понимать синтаксис запроса, но и просто неверно его выполнять ? :) P.S. daw, прекрасный вариант ! К сожалению, исключил для себя FULL JOIN, так как точно встречался с СУБД, который просто не знали что это такое :) Например, Informix 7.xx. Кстати, он же не понимал и подзапросов в пункте FROM(вариант-mir)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 02:05 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
Ok, мой вариант (при замене case на isnull сводится к уже описанному) : select case when t1.col1 is null then t2.col1 else t1.col1 end col1, sum (case when col2 is null then t2.col2 when t2.col2 is null then col2 else col2 + t2.col2 end) col2, from t1 full outer join t2 on(t1.col1 = t2.col1) group by case when t1.col1 is null then t2.col1 else t1.col1 end; Так на каких данных он будет давать неправильные результаты ? А насчет оптимальности - как только вы предложите запрос с Union, понимаемый Sybase IQ 12.5 - так сразу я его протестирую и выложу результаты и даже планы выполнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 04:20 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
vybegalloНу и по поводу цены выборки в СУБД с постолбцовым расположением данных. Дано : таблица из 2 колонок, 1M записей, каждая колонка 100 байт. Требуется : определить X1 - число прочитанных с диска байт для случая select col1 from t1 и X2 - для случая select col1, col2 from t1. Бонус и премия Филдса уходят тому, кто докажет X1 = X2А при чем здесь постолбцовое хранение? Или вы считаете, что для построчного хранения X1 = X2? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 06:37 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
vybegallo03 Так на каких данных он будет давать неправильные результаты ? ну, например: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 09:49 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
vybegallo03Так на каких данных он будет давать неправильные результаты ?Это же очевидно, см. пример daw... vybegallo03А насчет оптимальности - как только вы предложите запрос с Union, понимаемый Sybase IQ 12.5 - так сразу я его протестирую и выложу результаты и даже планы выполнения.Простите, но Вы невнимательны ChAВы-то пытаетесь решить единым запросом на большинстве СУБД, а не на одной конкретной. При чем здесь оптимальность только для Sybase IQ 12.5 ? Для другого сервера он может оказатся неоптимальным, или, по крайней мере, вариант с UNION ALL и GROUP BY может оказатся на них более оптимальным. Вам был предложен вариант, который выполнялся бы практически на всех вменяемых СУБД и с высокой степенью оптимальности. Это view на UNION ALL и группировка по нему. P.S.Тоже имею слабость решать некоторые задачи одним универсальным запросом, но всегда отдаю себе отчет, что оптимальность при этом может сильно пострадать... P.P.S. А на вопрос в очередной раз так и не ответили... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 12:48 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
mir vybegalloНу и по поводу цены выборки в СУБД с постолбцовым расположением данных. Дано : таблица из 2 колонок, 1M записей, каждая колонка 100 байт. Требуется : определить X1 - число прочитанных с диска байт для случая select col1 from t1 и X2 - для случая select col1, col2 from t1. Бонус и премия Филдса уходят тому, кто докажет X1 = X2А при чем здесь постолбцовое хранение? Или вы считаете, что для построчного хранения X1 = X2? Представьте себе - да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 21:03 |
|
||
|
Суммирование таблиц - задачка по SQL
|
|||
|---|---|---|---|
|
#18+
ChA vybegallo03Так на каких данных он будет давать неправильные результаты ?Это же очевидно, см. пример daw... vybegallo03А насчет оптимальности - как только вы предложите запрос с Union, понимаемый Sybase IQ 12.5 - так сразу я его протестирую и выложу результаты и даже планы выполнения.Простите, но Вы невнимательны ChAВы-то пытаетесь решить единым запросом на большинстве СУБД, а не на одной конкретной. При чем здесь оптимальность только для Sybase IQ 12.5 ? Для другого сервера он может оказатся неоптимальным, или, по крайней мере, вариант с UNION ALL и GROUP BY может оказатся на них более оптимальным. Вам был предложен вариант, который выполнялся бы практически на всех вменяемых СУБД и с высокой степенью оптимальности. Это view на UNION ALL и группировка по нему. P.S.Тоже имею слабость решать некоторые задачи одним универсальным запросом, но всегда отдаю себе отчет, что оптимальность при этом может сильно пострадать... P.P.S. А на вопрос в очередной раз так и не ответили... Прежде чем обсуждать оптимальность, желательно написать запрос, не выдающий синтаксических ошибок. Ну такая уж у меня попалась невменяемая СУБД, что select from (select) не понимает. Не она одна такая непонятливая, кстати - и Informix 7, и DB2 7.1 (насчет 8 не помню) тоже не понимают таких вариантов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 21:18 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33106019&tid=1545818]: |
0ms |
get settings: |
5ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
51ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 344ms |

| 0 / 0 |
