begin process at 2012 05 27 00:48:16
  Trouver un code source :
 
dans
 
Accueil > Forum > 

SQL

 > 

SQL Server, MSDE, SQL Express

 > 

Requêtes

 > 

UNION , ORDER BY et TOP qui ne fonctionne pas toujours et jamais en VBscript / ADODB.Recordset


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

UNION , ORDER BY et TOP qui ne fonctionne pas toujours et jamais en VBscript / ADODB.Recordset

vendredi 3 décembre 2010 à 17:22:28 | UNION , ORDER BY et TOP qui ne fonctionne pas toujours et jamais en VBscript / ADODB.Recordset

Egalon

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:

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


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

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

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:
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


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,



samedi 4 décembre 2010 à 17:22:20 | Re : UNION , ORDER BY et TOP qui ne fonctionne pas toujours et jamais en VBscript / ADODB.Recordset

Robert33

Membre Club

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
Code sql :
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.
dimanche 5 décembre 2010 à 12:28:09 | Re : UNION , ORDER BY et TOP qui ne fonctionne pas toujours et jamais en VBscript / ADODB.Recordset

Egalon

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!
lundi 6 décembre 2010 à 11:11:22 | Re : UNION , ORDER BY et TOP qui ne fonctionne pas toujours et jamais en VBscript / ADODB.Recordset

Egalon

La solution théorique pourrait être quelque chose comme:

Code sql :
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:
Code sql :
 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.

mardi 7 décembre 2010 à 21:49:46 | Re : UNION , ORDER BY et TOP qui ne fonctionne pas toujours et jamais en VBscript / ADODB.Recordset

aieeeuuuuu

Réponse acceptée !
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...
mercredi 8 décembre 2010 à 10:32:58 | Re : UNION , ORDER BY et TOP qui ne fonctionne pas toujours et jamais en VBscript / ADODB.Recordset

Egalon

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.


Cette discussion est classée dans : change, datetime, color, desc, milli


Répondre à ce message

Sujets en rapport avec ce message

DATETIME SQL SERVER AU SECOURS !!!!!! [ par MACHOMAN ] bonjour, j'ai plusieurs pb avec les datetime sous sql server : 1 - j'ai deux champs datetime, dans le premier il y a une date dans le second une heure Classement DESC ou ASC de colones [ par christobal ] Bonjour, pour etre + clair quand le visiteur est sur la page des offres il a devant lui un tableau j'aimerais qu'il puisse faire (comme sur d'autre si Aide en SQLServer2000 [ par sergiodonini ] Bonjour les amis, Je developpe une application Web en Arabe dynamique avec ASP et SQLServer2000, mon probleme est le suivant:J'ecris dans les champs d VB.net 2005 et SQL 2005 Express : Prbl DateTime [ par morleys ] Bonjour à vous tous,Je coince voilà quelque temps sur un probleme d'enregistrement de date SQL 2005.Si j'ai toto = Cdate(Now())        Pour info toto test si string (datetime) est correct. [ par tmcuh ] Voilà un big soucis avec SQL. Je récupère une donnée de type char[10] provenant d'une table (qui ne m'appartient pas) et je dois tester à l'interrieur dates qui plantent tout !! [ par chamallow ] Bonjour,Alors voilà, j'utilise une base SQL SERVER. Pour me rassurer, il n'existe pas de type date pour ce type de base non? (J'utilise datetime, parc problème concaténation [ par chamallow ] Bonjour,J'ai un petit problème avec une concaténation. C'est tout bête mais bon.SELECT CAST("1/1/" + CAST(annee AS CHAR(4)) AS DATETIME)from maTableSq Perte connexion MySQL si change date systeme [ par globule ] Bonjour, J'ai fait un programme en VB qui utilise des bases MySQL (en local ou sur un réseau) J'ai installé MySQL essential pour sql server 2000 + probleme de datetime ! [ par jimmy69 ] Bonjour,Dans une db sous sql server 2000 on a une table qui utilise une colonne de type datetime.J'aimerais savoir quelle est la query SQL à utiliser Vérification de créneaux de réservation [ par walterskinner ] <span style="FONT-SIZE: 10pt; COLOR:


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,936 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales