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

MS SQL Server Discussion :

[SQL Server 2005] Select avec contrainte d'unicite sur une colonne


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut [SQL Server 2005] Select avec contrainte d'unicite sur une colonne
    Salut à tous,

    j'imagine que la question a deja été posée, mais je n'ai pas trouvé de solution en faisant une recherche sur le forum.
    J'ai une table "lead_temp" avec les colonnes ref, name, address, phone, contact.
    Dans cette table, j'ai des données.
    Je vais intégrer ces données dans une table "lead" où la colonne ref va servir de clé unique.
    J'ai donc besoin de ramener, avec un select (pas de curseur possible), tous les enregistrements de "lead_temp" dont les colonnes "ref" sont différentes.

    Exemple :

    ref : 12532
    name : Company provider
    address : address1
    phone : 10329482
    contact : contact1@mail.us

    ref : 12532
    name : Company provider 2
    address : address2
    phone : 1035847
    contact : contact2@mail.us

    ref : 12527
    name : Company distributor
    address : address3
    phone : 39487738
    contact : contact3@mail.us

    Le select doit me ramener les renseignements concernant Company provider et Company distributor, mais pas Company provider 2, puisque j'ai deja Company provider avec une colonne ref identique.

    Je ne vois pas comment m'en sortir.
    Si vous avez des suggestions...

    Merci d'avance

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Il faut toujours bannir l'utilisation de curseurs, lent parce que procédural, et lui préférer du code ensembliste, ce pour quoi est conçu SQL Server :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT ref, name, address, phone, contact
    FROM lead_temp
    WHERE ref NOT IN (
    			SELECT ref
    			FROM lead
    			WHERE name = 'Company provider 2'
    		)
    Ou quelque chose dans ce style ...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Ouip
    Merci

    Le probleme c'est que j'ai pris l'exemple comme ca, la réponse que tu as donnée marche seulement pour cet exemple.
    Mais il me faudrait un truc dynamique.

    La ca me permet juste d'éviter la société Company provider 2. Je veux éviter les doublons sur la colonne ref mais je ne sais pas où ils sont.

    Je veux selectionner un lead pour chaque valeur de ref dans la table.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Pas d'idée ?
    Aucun moyen à part un curseur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE CurTmp CURSOR FOR
    SELECT ref, name, address, phone, contact FROM lead_temp
     
    OPEN CurTmp
    FETCH CurTmp INTO @ref, @name, @address, @phone, @contact
     
    WHILE @@Fetch_Status = 0
    BEGIN
     IF @ref NOT IN (SELECT DISTINCT ref FROM lead)
      INSERT INTO lead (ref,name,address,phone,contact) VALUES (@ref,@name,@address,@phone,@contact)
    FETCH NEXT FROM @CurTmp INTO @ref, @name, @address, @phone, @contact
    END
    CLOSE CurTmp
    DEALLOCATE CurTmp
    C'est une solution qui ne m'arrange pas

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Dans ce cas, enlevez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE name = 'Company provider 2'
    de la requête que je vous ai proposée

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Bonjour,

    Non, ca ne suffit pas. C'est plus compliqué que ca.
    Pour l'instant ca ne sont pas les doublons sur la colonne ref entre lead_temp et lead qui me préoccupent (ce point ne posera aucun probleme), mais les doublons sur la colonne ref dans lead_temp uniquement.
    Pour faire simple, imaginez que ma table lead est vide pour l'instant. Je ne veux pas, apres insertion des données de lead_temp, me retrouver avec des doublons sur la colonne ref.

    Pour reprendre l'exemple précédent :

    ref : 12532
    name : Company provider
    address : address1
    phone : 10329482
    contact : contact1@mail.us

    ref : 12532
    name : Company provider 2
    address : address2
    phone : 1035847
    contact : contact2@mail.us

    ref : 12527
    name : Company distributor
    address : address3
    phone : 39487738
    contact : contact3@mail.us

    Je voudrais une requete qui me ramene un, et un seul, enregistrement par ref

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 894
    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 : 21 894
    Points : 53 122
    Points
    53 122
    Billets dans le blog
    6
    Par défaut
    Faite un max ou un min et le tour est joué !

    SELECT ref, MAX(name), MIN(address), MAX(phone), MIN(contact)
    FROM lead_temp
    GROUP BY ref
    MAintenant si vous voulez la ligne qui correspond vous pouvez utiliser une fonction de fenêtrage comme ROW_NUMBER() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ref,  name, address, phone, contact
    FROM   (SELECT ref, name, address, phone, contact,
                   ROW_NUMBER() OVER (PARTITION BY ref ORDER BY name) AS N
            FROM lead_temp) AS T
    WHERE  N = 1
    A +

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    MAintenant si vous voulez la ligne qui correspond vous pouvez utiliser une fonction de fenêtrage comme ROW_NUMBER() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ref,  name, address, phone, contact
    FROM   (SELECT ref, name, address, phone, contact,
                   ROW_NUMBER() OVER (PARTITION BY ref ORDER BY name) AS N
            FROM lead_temp) AS T
    WHERE  N = 1
    A +
    Parfait !
    Merci beaucoup !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/12/2012, 15h36
  2. [SQL SERVER 2005] Update avec un SELECT
    Par djilos dans le forum Développement
    Réponses: 1
    Dernier message: 24/04/2010, 10h23
  3. Réponses: 4
    Dernier message: 12/08/2008, 12h20
  4. [SQL Server 2005] Selection de ce qui n'existe pas
    Par transistor49 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/04/2006, 09h20
  5. Connection de SQL SERVER 2005 EXPRESS avec HIBERNATE
    Par jerome giraud dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 27/02/2006, 09h07

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