[SQL - ORACLE] Faire un somme de count sur plusieurs tables

Faire un somme de count sur plusieurs tables [SQL - ORACLE] - SQL/NoSQL - Programmation

Marsh Posté le 27-07-2005 à 10:21:43    

Bonjour
 
Je cherche a faire la somme des enregistrements de plusieurs tables qui n'ont pas de liens ... et ça, en 1 seule requete.
C'est à dire que si une table contient 2 enregistrements, et la 2eme en contient 1, je dois avoir 3 comme résultat.
Pour info, j'ai 4 tables concernées
 
J'ai testé des méthodes proches de celles ci mais je n'arrive pas a le faire fonctionner (j'ai mis que 2 tables pour simplifier) :  

Code :
  1. SELECT SUM(a)
  2. FROM (SELECT 1 AS a FROM ... WHERE ....)
  3. UNION (SELECT 1 AS a FROM ... WHERE ...);


 
Quelqu'un a t'il une idée ?
 
Merci beaucoup
Worldofdada

Reply

Marsh Posté le 27-07-2005 à 10:21:43   

Reply

Marsh Posté le 27-07-2005 à 10:24:52    

Simple erreur de parenthèses, non?
 
select sum(a)
from  
(
select truc as a from chose where brol = chouette
union
select bidule as a from machin where pomme = poire
)
 
:??:
 
[edit]
 
Je viens de relire la question...ceci doit très bien faire l'affaire :
 
select count(*)
from (
select 1 from chose where brol = chouette
union
select 1 from machin where pomme = poire
)


Message édité par skeye le 27-07-2005 à 10:28:12

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 27-07-2005 à 10:38:03    

Merci pour ta réponse mais ... je viens de tester et ca ne fonctionne pas.
 
En reprennant ton exemple, si j'ai 4 choses et 0 machins (exactement les nombres que j'ai avec mes requetes), le count(*) me retourne 1 ...

Reply

Marsh Posté le 27-07-2005 à 10:43:09    

Worldofdada a écrit :

Merci pour ta réponse mais ... je viens de tester et ca ne fonctionne pas.
 
En reprennant ton exemple, si j'ai 4 choses et 0 machins (exactement les nombres que j'ai avec mes requetes), le count(*) me retourne 1 ...


 
ah merde, l'union doit virer les doublons...[:joce]
 
dans ce cas un truc de ce style devrai fonctionner :
 
select count(*)
from (
select 'chose' as table, id_chose as id from chose where brol = chouette
union
select 'machin' as table, id_machin as id from machin where pomme = poire
)


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 27-07-2005 à 10:55:05    

ho les gorets :o
 
-> Bon, déjà, les sous-requêtes, il faut toujours qu'elles retournent un MINIMUM de lignes, donc je ne veux voir que des COUNT() dedans.
-> Un UNION sur une donnée calculée, c'est pas une bonne idée, car il fait un distinct implicit. En plus, c'est lent. (ça l'est d'autant plus avec vos "select 1 from" parceque le union final ne retourne qu'une seule ligne, et ça a mis 3 plombes à la trouver...)
 
Bon, la solution qui marche et qui est rapide :
 

Code :
  1. select sum(val)
  2. from (
  3.   select count(*) val from a
  4.   union all
  5.   select count(*) val from b
  6.   union all
  7.   select count(*) val from c
  8.   union all
  9.   select count(*) val from d
  10. )


 
Et voilà.


Message édité par Arjuna le 27-07-2005 à 10:57:28
Reply

Marsh Posté le 27-07-2005 à 10:57:44    

me rappelais plus de 'union all' ([:joce])...c'est valable partout?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 27-07-2005 à 11:02:33    

normalement, oui, en tout cas SQL Server, Oralce, Access, MySQL et POostGre le supportent (testé par mes soins :D)

Reply

Marsh Posté le 27-07-2005 à 11:02:56    

Merci beaucoup
 
Ca marche niquel !
J'étais pas loin du résultat final mais heureusement que t'es passé pour me signaler le UNION ALL car sinon j'aurais eu des problèmes plus tard lors de doublons de données sans comprendre le soucis ...
 
Merci beaucoup a tous ceux qui ont répondus  ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed