IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requête SQL imbriquée


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 73
    Points : 54
    Points
    54
    Par défaut Requête SQL imbriquée
    Bonjour à tous,

    Je vais essayer d'être concis pour exposer mon problème.

    Aujourd'hui j'ai une base avec :
    - une table Computers avec les champs Computer, Description
    - une table Installed avec les champs Computer, Name, CalculatedVersion
    - une vue VersionMax avec les champs Name, CalculatedVersion

    Je souhaite afficher la liste des computers avec leur description et le nombre de versions (CalculatedVersion) dites obsolètes (inférieures à la plus récente) de chaque soft (Name).

    Voici mon code (en AutoIt) :
    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
    $sSQL = 'SELECT DISTINCT Computer, Description, Type FROM Installed INNER JOIN Computers USING (Computer)'
    	$iRval = _SQLite_GetTableData2D(-1, $sSQL, $g_aTotalUpdatesByComputer, $iRows, $aCols)
    	If $iRval <> $SQLITE_OK Then Exit
    	_ArrayColInsert($g_aTotalUpdatesByComputer, 3)
    	For $i = 0 To UBound($g_aTotalUpdatesByComputer) - 1
    		$g_aTotalUpdatesByComputer[$i][$eCol_OldVersions] = 0
    	Next
     
    	; - Version maxi pour chaque soft -
    	$sSQL = "SELECT * FROM VersionMax"
    	$iRval = _SQLite_GetTableData2D(-1, $sSQL, $aResult, $iRows, $aCols)
    	If $iRval <> $SQLITE_OK Then Exit
    ;~ 	va($aResult)
     
    	; - Nombre d'occurences du soft -
    	Local $iLastResult = @Compiled ? UBound($aResult) - 1 : ($MAXRESULT = -1 ? UBound($aResult) - 1 : $MAXRESULT)
    	ConsoleWrite("$iLastResult = " & $iLastResult & @CRLF)
    	For $iResult = 0 To $iLastResult
    		If StringRegExp($aResult[$iResult][$eDetailSofts_Name], $g_sExcluded) Then ContinueLoop
    		$sSQL = 'SELECT Computer  FROM Installed' & _
    				' WHERE Name = "' & $aResult[$iResult][$eDetailSofts_Name] & '" AND CalculatedVersion <> "' & $aResult[$iResult][$eDetailSofts_CalculatedVersion] & '"'
    ;~ 			ConsoleWrite($sSQL & @CRLF)
    		$iRval = _SQLite_GetTableData2D(-1, $sSQL, $aOldVersion, $iRows, $aCols)
    		If $iRval <> $SQLITE_OK Then Exit
     
    		For $i = 0 To UBound($aOldVersion) - 1
    			; Compte le nombre de mises à jour pour chaque computer
    			$iIndex = _ArraySearch($g_aTotalUpdatesByComputer, $aOldVersion[$i][0], 0, 0, 0, 0, 1, $eCol_Name)
    			$g_aTotalUpdatesByComputer[$iIndex][$eCol_OldVersions] += 1
    		Next
    	Next
    La première requête sert à créer un tableau contenant Computer, Description et le nombre de versions obsolètes initialisé à 0.
    La seconde requête permet de créer un tableau contenant tous les logiciels et leur version max.

    La troisième partie est une boucle qui itère tous les logiciels.
    Pour chaque logiciel, une requête récupère les computers qui ont ce logiciel installé en version inférieure à la plus récente.
    Pour chaque ordinateur trouvé, le nombre de versions obsolètes est incrémenté dans le tableau de la première requête.

    Ce traitement prend une dizaine de secondes. Ce qui est normal car il correspond au lancement de plus de 500 requêtes SQL.


    Je sais qu'il est possible de faire des requêtes imbriquées mais les exemples que j'ai trouvés ne correspondent pas à mon besoin qui est plus complexe.

    Pourriez-vous s'il vous plaît m'aider à optimiser mon traitement ?

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Je pars du principe que le résultat final, c'est le tableau Computer/Description/Nb de logiciel obsolète

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT DISTINCT 
       Computer, 
       Description, 
       (
          SELECT COUNT(*) 
          FROM Installed AS I
          INNER JOIN VersionMax AS VM ON I.Name = VM.Name
          WHERE I.Computer = C.Computer AND I.CalculatedVersion != VM.CalculatedVersion
       )
       FROM Computers AS C
    Il faudra peut être adapter un peu la requête, car je ne l'ai pas testé, et que votre première requête fait référence à la colonne Type, qui n'est décrite nulle part.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 73
    Points : 54
    Points
    54
    Par défaut
    Bonjour François,

    Je pensais vraiment que la solution serait plus complexe et j'ai un peu honte de ne pas avoir trouvé tout seul.

    Un grand merci pour la solution, c'est parfait.


    J'ai modifié la requête pour pouvoir trier par nombre de versions obsolètes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT Computer, Description, Type,
     (
     SELECT COUNT(*) FROM Installed AS I  INNER JOIN VersionMax AS VM ON I.Name = VM.Name  
    WHERE I.Computer = C.Computer AND I.CalculatedVersion != VM.CalculatedVersion 
    ) AS CNT
     FROM Computers AS C
     ORDER BY CNT

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/10/2009, 09h37
  2. Réponses: 4
    Dernier message: 11/06/2009, 16h03
  3. requete sql complexe, que faire: 2 sql imbriques ou fonction date?
    Par Aliveli dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 22/06/2006, 20h20
  4. Requete Sql imbriqué
    Par NeHuS dans le forum ASP
    Réponses: 11
    Dernier message: 01/06/2006, 12h17
  5. Requte Sql Avancée, question ... ? Estce possible ?
    Par plex dans le forum Administration
    Réponses: 8
    Dernier message: 14/12/2005, 15h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo