Bonjour,

Je fais mumuse avec SQL en ce moment et je me suis dit : tiens, est-il possible de mettre des SELECT dans les différentes clauses d'un SELECT, comme ça, pour satisfaire ma curiosité.

Voici mes tests et je vois que souvent c'est OK mais c'est KO pour le Group by (pb de syntaxe) et dans le Order by (pb de cohérence?).

SELECT DANS SELECT : OK
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
select table_name, (select count(*) from cat) from cat where rownum < 11 order by table_type;
TABLE_NAME                     			(SELECTCOUNT(*)FROMCAT)
------------------------------ 	--------------------------------------------------------------------------
AAPT_ACTION_QUEUE_CLIENT_APP                      	1458
ACCMINDEX                                         			1458
ACCOUNTING_BALANCE                                		1458
ACCOUNTING_ENTRY                                  		1458
ACCOUNT_MANAGER_PROFIL                            	1458
ACCOUNTING_ROOT                                   		1458
SELECT DANS FROM : OK
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
select table_name from (select table_name from cat) ;
TABLE_NAME                    
------------------------------
AAPT_ACTION_QUEUE_CLIENT_APP  
ACCMINDEX                     
ACCOUNTING_BALANCE            
ACCOUNTING_ENTRY              
ACCOUNTING_ENTRY_HISTO
SELECT DANS WHERE : OK
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
select table_name from cat where rownum = (select count(*) from dual) order by table_type;
TABLE_NAME                    
------------------------------
AAPT_ACTION_QUEUE_CLIENT_APP
SELECT DANS GROUP BY : KO (syntaxe)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
select table_type from cat where rownum < 50 group by (select 'TABLE_TYPE' from dual)
                                                       					*
Error at line 1
ORA-22818: expressions de sous-requête non autorisées ici
SELECT DANS HAVING : OK
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
select table_type, count(*) from cat group by TABLE_TYPE having count(*) < (select count(*) from cat)/10;
TABLE_TYPE    COUNT(*)
----------- ----------
VIEW                43
SYNONYM              5
SELECT DANS ORDER BY : KO (exécution)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
select table_type, count(*) from cat group by TABLE_TYPE order by (select 2 from dual);
TABLE_TYPE    COUNT(*)
----------- ----------
TABLE             1236
SEQUENCE           174
SYNONYM              5
VIEW                43
Estc-e que vous pourriez me dire pourquoi c'est interdit dans le Group by et pourquoi le résultat du SELECT dans le Order by n'est pas pris en compte?