Bonjur,
je souhaite comparer en sql (oracle) le nombre d'enregistrement de deux tables. et je veux que l'ordre me ramène un résulat "ok", par exemple
@+![]()
Bonjur,
je souhaite comparer en sql (oracle) le nombre d'enregistrement de deux tables. et je veux que l'ordre me ramène un résulat "ok", par exemple
@+![]()
Voici un code en PLSQL , surement pas le meilleur en teme SQL, mais qui repond a ton besoin, j'ai cru coprendre que tu faus du PL .... neanmoins, garde a l'esprit que ce que tu cherches a faire
peut etre COUTEUX, je ne rentre pas dans les details de 'Tuning' mais ce genre de requete est assimilé a full table scan , ou a un "index fast full scan " si la requete a une clause "WHERE" sur une colonne indexée ... si mes souvenirs sont bon ...
Bref, peu y'avoir un probleme au niveau perf applicatif ....
Hope this help ...
haha.. j'ai oublié de poster le code ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
27
28
29
30
31 create or replace function testCount return varchar2 is lv_tabCount1 number; lv_tabCount2 number; begin select count(*) into lv_tabCount1 from emp ; select count(*) into lv_tabCount2 from emp_test ; dbms_output.put_line('lv_tabCount1 = '||lv_tabCount1); dbms_output.put_line('lv_tabCount2 = '||lv_tabCount2); if lv_tabCount1 = lv_tabCount2 then return 'OK'; else return 'Not ok'; end if; end; / show error;
autre info: quand je parle de "champ indexé" je veux dire une PK (primary key ) ... attention au champ null ...
Ah ok, je suis obligé de passer par du PL...
Mais je pensais qu'il y avait un moyen plus simple, j'ai bien essayé de passer des count dans les where, mais ça ne fonctionne pas du tout...
pour ce qui est de la perf, c'est pas grave, c'est dans le cadre d'une recette, et je suis en train de coder des requettes, qui me permettent de recetter en quasi auto... Voilà et bien je te remercie beaucoup.
Tu peux aussi faire cela :
PS : le AS Nombre ne sert à rien d'autre qu'à lever l'ambiguité (pour les êtres humains, pas pour le parser) sur le COUNT(*) qui est dans le DECODE.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT DECODE(COUNT(*), 2, 'Non', 'Oui') FROM (SELECT COUNT(*) AS Nombre FROM Table1 UNION SELECT COUNT(*) FROM Table2)
Mediat, t'es sûr que ta méthode fonctionne ?
J'aurais plutôt fait quelque chose comme cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 select decode ((select count(*) from table1), (select count(*) from table2), 'oui', 'non') from dual;
Bonjour plaine,
les deux requêtes sont équivalentes.
En effet, si le nombre est le même dans les deux tables, le union reverra une ligne...
Tout à fait aline, c'est d'ailleurs pourquoi il ne faut surtout pas mettre UNION ALL.
Bonjour Aline et Mediat,
Merci pour ces précisions. Je dois avouer que je n'ai pas beaucoup réfléchi avant de poster.![]()
Oui, la requête de Médiat est intéressante, je me la colle quelque part pour m'en resservir un jour.
Mouais... mais ça fait du tri sur un SELECT *Envoyé par Médiat
je vous propose :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select DECODE((select count(*) from table1) - (select count(*) from table2), 0, 'OK','KO') FROM dual
Ce qui revient à quelque chose près à ce que j'ai proposéEnvoyé par orafrance
![]()
Détail qui m'avait échappé
![]()
Merci de m'avoir corrigé![]()
???Envoyé par orafrance
Le tri se fait sur le résultat des deux requêtes COUNT(*), c'est à dire sur 2 lignes, cela ne devrait pas poser de problème, je pense.
Moi ce sont les soustractions que je n'aime pasEnvoyé par orafrance
![]()
Eh bien les gars je vous mets d'accord, ma solution ne comporte ni tris inutiles, ni soustractions !![]()
Et comment tu fais s'il y a 3 tables à comparer, ou 134752 ?Envoyé par plaineR
![]()
Partager