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 :

simulation limit sur SQL server


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut simulation limit sur SQL server
    Bonjour à tous, je bloque sur une requête SQL sur une base SQLserver

    plus habitué à la fonction limit sur mySQL, je rame un peu pour reproduire ça sur SQL server. J'ai trouvé sur la toile une méthode pour la simuler, tout fonctionne bien jusque au moment ou je veux y ajouter des jointures.
    Ma requete ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from (select top 4 * from (select top 4 * from listingDestinataire INNER JOIN destinataire ON listingDestinataire.idDestinataire=destinataire.id WHERE idListing = 6 AND actif = 1) as t1 order by id DESC) as t2 order by id
    Je l'ai retourné dans tous les sens,
    et je me retrouve toujours avec ce message très obscur pour moi :

    Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

    [Microsoft][SQL Native Client][SQL Server]La colonne 'id' a été spécifiée plusieurs fois pour 't1'.

  2. #2
    Membre averti
    Avatar de SoBaKa
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 349
    Points
    349
    Par défaut
    Moi j'appelle ça une requête horrible lol

    ça ne serait pas suffisant juste ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT top 4 * FROM listingDestinataire 
    INNER JOIN destinataire 
    ON listingDestinataire.idDestinataire=destinataire.id 
    WHERE idListing = 6 AND actif = 1 
    ORDER BY destinataire.id DESC
    Parce que ton code il disait ça :

    Tu récupères les 4 premiers des 4 derniers des 4 que tu as déjà récupéré grâve à la jointure...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci pour ta réponse, les chiffres (4 en l'occurence) sont des variables et sont appelés à changer.
    Je doit pouvoir extraire x résultats à partir de la ligne y.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    SELECT * FROM
    (SELECT top x * FROM
    (SELECT top y * FROM listingDestinataire
    INNER JOIN destinataire
    ON listingDestinataire.idDestinataire=destinataire.id
    WHERE idListing = 6
    AND actif = 1) AS t1
    ORDER BY id DESC) AS t2
    ORDER BY id

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 100
    Points : 28 391
    Points
    28 391
    Par défaut
    Je ne sais pas quelle version de SQL Server tu utilises, mais il existe des fonctions très puissantes dites "de regroupement analytique", parmi lesquelles la fonction ROW_NUMBER(), qui sont conformes à la norme SQL (contrairement à TOP et LIMIT).

    Pour extraire x lignes à partir de la ligne y :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT col1
     , col2
     , col...
    FROM 
     ( SELECT col1
        , col2
        , col...
        , ROW_NUMBER() OVER (ORDER BY id) AS num_ligne
       FROM matable
     ) AS tmp
    WHERE num_ligne BETWEEN y AND y + x - 1

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci

    Je suis un novice, je vais donc étudier cette fonction qui me semble prometeuse dès lundi. Je vous tiens au courant.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Bonjour
    Je viens de verifier, malheureusement , ROW_NUMBER() ne fait pas partie de ma panoplie. (SQL server 2000)

    Quelqu'un as-t-il une autre idée ?

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 100
    Points : 28 391
    Points
    28 391
    Par défaut
    Pour obtenir des résultats cohérents, TOP doit être associé à ORDER BY.
    Donc si je reprends ton exemple :
    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
    SELECT  * 
    FROM
        (   SELECT TOP x * 
            FROM
                (   SELECT TOP y * 
                    FROM    listingDestinataire AS ld
                        INNER JOIN 
                            destinataire    AS ds
                            ON  ld.idDestinataire = ds.id
                    WHERE   idListing = 6
                        AND actif = 1
                    ORDER BY ds.id
                )   AS t1
            ORDER BY id DESC
        )   AS t2
    ORDER BY id
    ;
    Cette requête te retournera x lignes, jusqu'à la ligne y (donc à partir de la ligne y-x+1), en se basant sur ds.id pour déterminer l'ordre des lignes.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Tout le problème est là, cela ne diffère pas de la requête que j'ai mis dans mon premier post. : mis en forme cela donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT * 
    	FROM (SELECT top x *
    		FROM (SELECT top y *
    			FROM listingDestinataire INNER JOIN destinataire
    			ON listingDestinataire.idDestinataire=destinataire.id
    		WHERE idListing = 6 AND actif = 1) AS t1
    	ORDER BY id DESC) AS t2
    ORDER BY id
    Ce qui a pour effet de me retourner invariablement :
    La colonne 'id' a été spécifiée plusieurs fois pour 't1'.
    La colonne 'id' a été spécifiée plusieurs fois pour 't2'.

    Je ne comprend même pas le sens de ce message.
    Table destinataire :
    id
    nom
    prenom
    ....

    Table listingDestinataire :
    id
    idDestinataire
    idListing

    avec une soudaine inspiration j'ai donc viré la colonne id de la table listingDestinataire , et ô joie incommensurable, la requête fonctionne. ça tombe bien, elle ne me servait à rien.

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 100
    Points : 28 391
    Points
    28 391
    Par défaut
    Citation Envoyé par anatole44 Voir le message
    Tout le problème est là, cela ne diffère pas de la requête que j'ai mis dans mon premier post.
    Regarde bien les ORDER BY

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

Discussions similaires

  1. limitation de données sur SQL server / Access / MySQL
    Par alexfrei04 dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 06/02/2007, 15h43
  2. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 16h55
  3. SqlCommand sur SQL Server 7.0
    Par sangokus dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/03/2004, 10h22
  4. Replication d'une base AS/400 sur SQL Server
    Par david_chardonnet dans le forum Autres SGBD
    Réponses: 9
    Dernier message: 21/11/2003, 11h17
  5. problème de float sur SQL server 2000.
    Par fidji dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 24/07/2003, 14h15

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