UNION , ORDER BY et TOP qui ne fonctionne pas toujours et jamais en VBscript / A

Résolu
Egalon Messages postés 124 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 17 juin 2011 - 3 déc. 2010 à 17:22
Egalon Messages postés 124 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 17 juin 2011 - 8 déc. 2010 à 10:32
Bonsoir à tous,
vous allez voir, c'est drôle...
j'effectue une requete pour obtenir la date la plus récente (sur Mgnt Studio de SQL server 2008) dans différentes tables similaires:

SELECT TOP 1 Change_DateTime, Change_Milli FROM Table1 ORDER BY Change_DateTime DESC , Change_Milli DESC

Toutefois, UNION entre mes requetes sont pas acceptées à cause de mes ORDER BY à chaque sous-requete, ce que je trouve anormal:

[b] SELECT TOP 1 Change_DateTime, Change_Milli FROM Table1 ORDER BY Change_DateTime DESC , Change_Milli DESC UNION
SELECT TOP 1 ,Change_DateTime, Change_Milli FROM Table2 ORDER BY Change_DateTime DESC , Change_Milli DESC /b

mais si je les imbrique dans un autre SELECT, ca passe:

[b]SELECT * FROM (
SELECT TOP 1 Change_DateTime, Change_Milli FROM Table1 ORDER BY Change_DateTime DESC , Change_Milli DESC UNION
SELECT TOP 1 Change_DateTime, Change_Milli FROM Table2 ORDER BY Change_DateTime DESC , Change_Milli DESC UNION
SELECT TOP 1 Change_DateTime, Change_Milli FROM Table3 ORDER BY Change_DateTime DESC , Change_Milli DESC UNION
SELECT TOP 1 Change_DateTime, Change_Milli FROM Table4_Alarms ORDER BY Change_DateTime DESC , Change_Milli DESC UNION
SELECT TOP 1 Change_DateTime, Change_Milli FROM Table5 ORDER BY Change_DateTime DESC , Change_Milli DESC
)AS TopDates ORDER BY Change_DateTime DESC , Change_Milli DESC/b
Ce qui est le but recherché.
Je peux obtenir un résultat similaire avec une requete plus conventionnelle, unir les tables et sortir l'enregistrement le plus récent. Mais ca ne va pas aussi vite:
[b] SELECT * FROM (
SELECT Change_DateTime, Change_Milli FROM Table1 UNION
SELECT Change_DateTime, Change_Milli FROM Table2 UNION
SELECT Change_DateTime, Change_Milli FROM Table3 UNION
SELECT Change_DateTime, Change_Milli FROM Table4 UNION
SELECT Change_DateTime, Change_Milli FROM Table5
)AS TopDates ORDER BY Change_DateTime DESC , Change_Milli DESC/b

Et comme le titre l'indique, aucune des 2 propositions ne fonctionne en Vbscript avec ADODB.RecordSet, résultat : recordCount = -1.
C'est marrant au début mais au bout d'1h30 je rigole moins...
Pour une éventuelle solution, mes contraintes sont: je garde des tables séparées, j'utilise VBS et j'évite les traitements sur les dates dans VBS car une conversion s'impose. Et si y en a pas, j'aurai servi au moins d'avertisseur sur ce problème.
Cdt,
A voir également:

5 réponses

aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
7 déc. 2010 à 21:49
Bonjour

avez vous trouvé votre solution ?
vous dites "recordCount = -1"... avez-vous quand meme tenté de récupérer au moins le premier tuple du recordset ou verifié par un autre moyen que recordCount si le recordset etait vraiment vide ?
J'ai un vague souvenir d'un recordCount qui ne donnait la bonne valeur... qu'après qu'on avait defilé la totalité du recordset...

Juste une piste a tester...
1
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
4 déc. 2010 à 17:22
Bonjour

Ha oui, ce bon vieux probleme des ORDER BY dans les unions...
en fait ça parait un peu normal, que le tri soit fait après l'union, mais c'est vrai que dans certains cas ça enerve un peu

dans ton cas, passe par une clause MAX,
et sans doute un UNION ALL au cas ou il y ait des valeurs identiques dans les differentes tables
SELECT MAX(Change_Milli) AS Change_Milli, MAX(Change_DateTime) AS Change_DateTime FROM Table1
UNION ALL
SELECT MAX(Change_Milli) AS Change_Milli, MAX(Change_DateTime) AS Change_DateTime FROM Table2
UNION ALL
SELECT MAX(Change_Milli) AS Change_Milli, MAX(Change_DateTime) AS Change_DateTime FROM Table3


Bob.
0
Egalon Messages postés 124 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 17 juin 2011
5 déc. 2010 à 12:28
Bonjour,
merci, je ne connaissais pas la particularité UNION ALL.
Toutefois, si j'aggrège par un MAX, je pense retrouver le maximum, donc la date la plus récente d'une part et d'autre part la valeur de millisecondes la plus élevée et non le couple dateTime + Millisecond le plus récent.
D'autre part, UNION ALL existe sur toutes les plates formes SQL?
Par ailleurs, un SELECT MAX doit certainement être infiniment plus rapide qu'un SELECT TOP 1 / ORDER BY.
Je repars sur cette piste Lundi au boulot.
Merci!
0
Egalon Messages postés 124 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 17 juin 2011
6 déc. 2010 à 11:11
La solution théorique pourrait être quelque chose comme:

SELECT TOP 1 App_DateTime as R1,MAX(App_Milli) as R2 FROM (
  Select App_DateTime,  App_Milli FROM _Appli_Export_DEBIT_Export_Alarms  	  
  UNION ALL Select App_DateTime, App_Milli FROM _Appli_Export_EVT_Export_Alarms 	  
  UNION ALL Select App_DateTime, App_Milli FROM _Appli_Export_Motors_Export_Alarms 	  
  UNION ALL	Select App_DateTime, App_Milli FROM _Appli_Export_Valve_Export_Alarms 	  
  UNION ALL	Select App_DateTime, App_Milli FROM _Appli_histo_evt	  
) AS T1  	 
WHERE 	T1.App_DateTime = (
  Select MAX(App_DateTime) FROM
  (
  Select MAX(App_DateTime) as App_DateTime FROM _Appli_Export_DEBIT_Export_Alarms  		
  UNION ALL Select MAX(App_DateTime) as App_DateTime FROM _Appli_Export_EVT_Export_Alarms  		
  UNION ALL Select MAX(App_DateTime) as App_DateTime FROM _Appli_Export_Motors_Export_Alarms  	
  UNION ALL Select MAX(App_DateTime) as App_DateTime FROM _Appli_Export_Valve_Export_Alarms 
  UNION ALL Select MAX(App_DateTime) as App_DateTime FROM _Appli_histo_evt 	
  ) As T2 	
  WHERE App_DateTime Is Not Null 
  )
GROUP BY T1.App_DateTime ORDER BY T1.App_DateTime DESC

Toutefois, un ADO recordSet ne sait pas faire ça dans VBS:
 Select MAX(App_DateTime) as App_DateTime FROM _Appli_Export_DEBIT_Export_Alarms  		
  UNION ALL Select MAX(App_DateTime) as App_DateTime FROM _Appli_Export_EVT_Export_Alarms  		
  UNION ALL Select MAX(App_DateTime) as App_DateTime FROM _Appli_Export_Motors_Export_Alarms  	
  UNION ALL Select MAX(App_DateTime) as App_DateTime FROM _Appli_Export_Valve_Export_Alarms 
  UNION ALL Select MAX(App_DateTime) as App_DateTime FROM _Appli_histo_evt 

je vais donc décomposer en plusieurs requêtes .
Merci encore à Bob.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Egalon Messages postés 124 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 17 juin 2011
8 déc. 2010 à 10:32
Bonjour,
effectivement, c'est pas parce que le recordCount = -1 que le résultat est vide...
Je peux refaire de grosses requetes pour obtenir un résultat précis.
merci bien.
0
Rejoignez-nous