пятничный пряник.. :)

Vladмир
Дата: 14.12.2012 12:44:53
наверное, это "пятничная задача"
:)
в коде одного из поддерживаемых продуктов узрел такой "шедевр", упрощенно версия которого здесь предлагается на рассмотрение. Вообще запрос по большой связке табл., в выборке строки возможно повторяются, но без единой агрегирующей фкц, используется с группировка по всем полям):
select * from (
SELECT 1 A,1 B,1 C FROM DUAL UNION ALL 
SELECT 1 A,1 B,1 C FROM DUAL UNION ALL
SELECT 1 A,1 B,1 C FROM DUAL UNION ALL
SELECT 1 A,1 B,1 C FROM DUAL 
) 
group by a,b,c


Долго думал.. не понял. Собственно, стало интересно, чем вышеприведенное "умнее" следующей версии:
select  distinct * from (
SELECT 1 A,1 B,1 C FROM DUAL UNION ALL
SELECT 1 A,1 B,1 C FROM DUAL UNION ALL
SELECT 1 A,1 B,1 C FROM DUAL UNION ALL
SELECT 1 A,1 B,1 C FROM DUAL 
) 

может быть действительно, есть какой то смысл?
Человек и Кошка
Дата: 14.12.2012 12:50:25
Vladмир
наверное, это "пятничная задача"

дожили...
Каждая .. мнит себя гением
Дата: 14.12.2012 12:50:33
Vladмир
наверное, это "пятничная задача"
-2-
Дата: 14.12.2012 12:52:12
Vladмир
может быть действительно, есть какой то смысл?
когда-то был
orawish
Дата: 14.12.2012 13:55:49
когда я вижу группировку чего-либо из дуала - ни о чём другом думать не могу
+
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management,
OLAP,
Data Mining and Real Application Testing options
SQL> 
SQL> select grouping(a),a ,grouping(b),b
  2    from ( select 1 A ,1 B from dual
  3  ) group by grouping sets((a,b),a,b,());

GROUPING(A)          A GROUPING(B)          B                                   
----------- ---------- ----------- ----------                                   
          0          1           0          1                                   
          0          1           0          1                                   
          0          1           0          1                                   
          1          1           1          1                                   

SQL> 
SQL> select grouping(a),a ,grouping(b),b
  2    from ( select 1 A ,1 B from dual
  3  ) group by cube(a,b);

GROUPING(A)          A GROUPING(B)          B                                   
----------- ---------- ----------- ----------                                   
          0          1           0          1                                   
          0          1           0          1                                   
          0          1           0          1                                   
          1          1           1          1                                   

SQL> 
SQL> select grouping(a),a ,grouping(b),b
  2    from ( select 1 A ,count(*) B from dual
  3  ) group by cube(a,b);

GROUPING(A)          A GROUPING(B)          B                                   
----------- ---------- ----------- ----------                                   
          1                      1                                              
          1                      0          1                                   
          0          1           1                                              
          0          1           0          1                                   

на всякий случай (если кому лень думать) - из тех трёх запросов только последний не врёт.
из чего вывод - группируйте что угодно, но только не дуал с его магией говёной.
user1251
Дата: 14.12.2012 14:00:54
Vladмир,

Стыдно должно быть вам, а не тому разработчику, потому что group by - основы SQL.
Скорее всего остался после удаления агрегирующей функции, разницы чаще всего нет.

Различие в планах, в большинстве случаев HASH/SORT UNIQUE либо HASH/SORT GROUP BY.
По производительности, судя по всему, одинаково, distinct в редких случаях бывает умнее, т.к. умеет выкидывать лишние операции из планов (distinct уникального столбца).
-2-
Дата: 14.12.2012 14:04:01
user1251
Скорее всего остался после удаления агрегирующей функции
некторые считают group by эффективнее. несколько версий это так и было, поскольку Hash group by появился раньше hash unique

user1251
разницы чаще всего нет.
разница в том, что эти запросы неэквивалентны.
Vint_______________
Дата: 14.12.2012 14:23:45
orawish,
Кайт после семинара так и сказал, нефиг использовать магию дуала))
user1251
Дата: 14.12.2012 14:27:33
-2-
разница в том, что эти запросы неэквивалентны.

Еще раз, они эквиваленты в плане выборки и чаще всего в плане производительности для недревних версий. Кроме редких случаев, вроде distinct уникального столбца,
-2-
Дата: 14.12.2012 14:33:38
user1251
-2-
разница в том, что эти запросы неэквивалентны.

Еще раз, они эквиваленты в плане выборки
они эквивалентны только в частном случае
select * from (
SELECT 'a' A,1 B,1 C FROM DUAL UNION ALL
SELECT 'A' A,1 B,1 C FROM DUAL UNION ALL
SELECT 'a' A,1 B,1 C FROM DUAL UNION ALL
SELECT 'a' A,1 B,1 C FROM DUAL 
) 
group by a,b,c;

A B C
- - -
a 1 1 


select  distinct * from (
SELECT 'a' A,1 B,1 C FROM DUAL UNION ALL
SELECT 'A' A,1 B,1 C FROM DUAL UNION ALL
SELECT 'a' A,1 B,1 C FROM DUAL UNION ALL
SELECT 'a' A,1 B,1 C FROM DUAL 
);

A B C
- - -
a 1 1 
A 1 1