UNION , ORDER BY et TOP qui ne fonctionne pas toujours et jamais en VBscript / A [Résolu]

Egalon 126 Messages postés lundi 26 avril 2004Date d'inscription 17 juin 2011 Dernière intervention - 3 déc. 2010 à 17:22 - Dernière réponse : Egalon 126 Messages postés lundi 26 avril 2004Date d'inscription 17 juin 2011 Dernière intervention
- 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,
Afficher la suite 

5 réponses

Répondre au sujet
aieeeuuuuu 698 Messages postés jeudi 16 janvier 2003Date d'inscription 20 mai 2011 Dernière intervention - 7 déc. 2010 à 21:49
+3
Utile
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...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de aieeeuuuuu
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 4 déc. 2010 à 17:22
0
Utile
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.
Commenter la réponse de cs_Robert33
Egalon 126 Messages postés lundi 26 avril 2004Date d'inscription 17 juin 2011 Dernière intervention - 5 déc. 2010 à 12:28
0
Utile
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!
Commenter la réponse de Egalon
Egalon 126 Messages postés lundi 26 avril 2004Date d'inscription 17 juin 2011 Dernière intervention - 6 déc. 2010 à 11:11
0
Utile
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.
Commenter la réponse de Egalon
Egalon 126 Messages postés lundi 26 avril 2004Date d'inscription 17 juin 2011 Dernière intervention - 8 déc. 2010 à 10:32
0
Utile
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.
Commenter la réponse de Egalon

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.