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 :

[Sql server 2000} Groupe By et champs de type image


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de paradeofphp
    Inscrit en
    Décembre 2005
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 313
    Par défaut [Sql server 2000} Groupe By et champs de type image
    Je veux afficher a partir de 4 tables des informations a propos des étudiants.
    chaque étudiant a au moins une carte. Néamoins, je ne veux afficher que la carte qui a une date d'attribution la plus récente. ALors j'ai construit la requête suivante avec l'assistant de création des vues de Sql Server 2000.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT     MAX(dbo.CARTES.DATE_ATTRIBUTION) AS Expr1, dbo.PORTEUR.ID_PERSONNE, dbo.SUPPORTE.NUMSERIE, dbo.PERSONNES.NOM, 
                          dbo.PERSONNES.PRENOM, dbo.PERSONNES.Dte_Naissance, dbo.PORTEUR.ID_PORTEUR, dbo.PORTEUR.ID_CARTE, dbo.PERSONNES.PHOTO, 
                          dbo.PERSONNES.STOCKAGE_PHOTO
    FROM         dbo.PORTEUR INNER JOIN
                          dbo.PERSONNES ON dbo.PORTEUR.ID_PERSONNE = dbo.PERSONNES.ID_PERSONNE INNER JOIN
                          dbo.SUPPORTE ON dbo.PORTEUR.ID_CARTE = dbo.SUPPORTE.ID_CARTE INNER JOIN
                          dbo.CARTES ON dbo.PORTEUR.ID_CARTE = dbo.CARTES.ID_CARTE AND dbo.SUPPORTE.ID_CARTE = dbo.CARTES.ID_CARTE
    WHERE     (dbo.PORTEUR.ID_TYPE_PORTEUR = 'Etu')
    GROUP BY dbo.PORTEUR.ID_PERSONNE, dbo.SUPPORTE.NUMSERIE, dbo.PERSONNES.NOM, dbo.PERSONNES.PRENOM, dbo.PERSONNES.Dte_Naissance, 
                          dbo.PORTEUR.ID_PORTEUR, dbo.PORTEUR.ID_CARTE, dbo.PERSONNES.PHOTO
    Lorsque j'ai voulu l'executer, j'ai eu le message d'erreur suivant :

    Le colonne dbo.PERSONNES.STOCKAGE_PHOTO n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.

    J'ai rajouté manuellement dbo.PERSONNES.STOCKAGE_PHOTO dans la clause Group By et j' ai eu l'erreur suivante :

    Les types de données text, ntext et image ne peuvent être comparés ou classés, sauf lors de l'utilisation de l'opérateur Like ou IS NULL.

    effectivement j'ai ce champs (dbo.PERSONNES.STOCKAGE_PHOTO) et de type binaire dans lequel je stocke des images.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Pour faire un groupage il faut réaliser un tri. Les tris sont des algorithmes tres couteux. Imaginez que chaque colonne "IMAGE" de votre table contienne 2 Go de données et qu'il y ait 1 millions de lignes. Combien d'heure à votre avis SQL Server mettre t-il pour faire ce tri ?
    C'est pour cette raison que les colonnes de type Blobs (comme TEXT, NTEXT et IMAGE) ne peuvent faire l'objets de telle opérations...

    En encapsulant votre requête dans une table dérivée la chose devient indirectement possible :

    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
    SELECT T.*, P.STOCKAGE_PHOTO 
    FROM   dbo.PERSONNES AS P
           INNER JOIN (SELECT MAX(CS.DATE_ATTRIBUTION) AS Expr1, PR.ID_PERSONNE, 
                              SP.NUMSERIE, PS.NOM, PS.PRENOM, PS.Dte_Naissance, 
                              PR.ID_PORTEUR, PR.ID_CARTE, PS.PHOTO, PS.ID_PERSONNE
                       FROM   dbo.PORTEUR PR
                              INNER JOIN dbo.PERSONNES PS
                                    ON PR.ID_PERSONNE = PS.ID_PERSONNE 
                              INNER JOIN dbo.SUPPORTE SP
                                    ON PR.ID_CARTE = PS.ID_CARTE 
                              INNER JOIN dbo.CARTES CS
                                    ON PR.ID_CARTE = CS.ID_CARTE 
                                       AND SP.ID_CARTE = CS.ID_CARTE
                       WHERE  PR.ID_TYPE_PORTEUR = 'Etu'
                       GROUP  BY PR.ID_PERSONNE, SP.NUMSERIE, PS.NOM, 
                                 PS.PRENOM, PS.Dte_Naissance, PR.ID_PORTEUR, 
                                 PR.ID_CARTE, PS.PHOTO ) AS T
                  ON P.ID_PERSONNE = T.ID_PERSONNE
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 18
    Dernier message: 30/11/2011, 09h55
  2. [SQL SERVER 2000] Comment declarer un champ blob?
    Par Fabrice ROUXEL 1 dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/04/2007, 09h54
  3. [SQL Server 2000/05] les n premieres lignes d'un group by
    Par pierre-o dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2006, 12h25
  4. [SQL SERVER 2000]taille et type des champs
    Par Franck2mars dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 09/05/2006, 11h59
  5. [SQL Server 2000] inverser le signe d'un champ money
    Par sephiroth84 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 29/08/2005, 14h55

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