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 :

Mettre à jour un nouveau champs à partir des anciens ? + Valeur d'un champ externe


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Points : 6
    Points
    6
    Par défaut Mettre à jour un nouveau champs à partir des anciens ? + Valeur d'un champ externe
    Bonjour à tous,

    j'ai une ancienne table qui contient quelques centaines de milliers de lignes, mais qui n'a pas d'ID Unique excepté la concatenation de plusieurs champs VARCHAR, mais ce qui n'est pas terrible pour les performances.

    J'ai une formule magique 'CRCMagic' qui peut à partir de ces champs faire un entier unique.

    J'ai donc fait un ALTER TABLE MaTable ADD ColIDX INTEGER; pour ajouter la nouvelle colonne où je veux stocker l'ID unique calculé par CRCMagic.

    Existe-t-il une commande SQL qui me permette de faire un SELECT sur l'ensemble des lignes de MaTable puis d'appliquer à chacune des lignes ma formule de transformation et faire un UPDATE de la colonne ColIDX en fonction des autres colonnes ?

    Merci d'avance !

    EDIT : Oups petit détail supplémentaire : En plus des valeurs des champs eux mêmes, j'aurais besoin de pouvoir accéder à une valeur extérieur, une sorte de variable que je pourrais autoincrémenter du style :

    UPDATE MaTable
    SET ColIDX=CRCMagic(Col1,Col2,Col3) + uneValeur extérieure qui s'incrémente ...

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par Nibbler
    Existe-t-il une commande SQL qui me permette de faire un SELECT sur l'ensemble des lignes de MaTable puis d'appliquer à chacune des lignes ma formule de transformation et faire un UPDATE de la colonne ColIDX en fonction des autres colonnes ?
    Oui mais apparemment vous savez déjà le faire :

    Citation Envoyé par Nibbler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE MaTable
    SET ColIDX=CRCMagic(Col1,Col2,Col3) + uneValeur extérieure qui s'incrémente ...
    Concernant le reste de votre demande, à mon sens, ça dépend pas mal de votre SGBD et sa version (qui sont ?)...

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Bonjour Magnus,

    J'utilise Firebird 1.5.

    oui j'ai trouvé le UPDATE dans les tutoriels, qui marche très bien si tous les champs appartiennent à la même table que le champs que je souhaite updater

    Le problème majeur reste actuellement de pouvoir updater avec une valeur qui se modifie dans une autre table :

    Du style pour faire un champs auto-incrémenté je souhaite stocker la derniére valeur dans MAX_VALUE d'une autre table et faire la requête


    UPDATE MaTable, TableConfig
    SET MaTable.ColIDX=(Select MAX_VALUE from TableConfig)
    SET TableConfig.MAX_VALUE=TableConfig.MAX_VALUE+1 ...

    le problème c'est qu'il faudrait en même temps mettre à jour MAX_VALUE et j'ai pas réussi à faire un update sur deux tables à la fois ...

    J'ai essayé de faire un auto-update :

    UPDATE MaTable
    SET ColIDX=(Select Max(ColIDX) from MaTable)+1;

    Mais soit c'est horriblement lent ce qui peut se comprendre , ça doit faire une requête en o(n²), soit j'ai planté Firebird, mais depuis deux heures j'ai le CPU à 100%

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 886
    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 886
    Points : 53 092
    Points
    53 092
    Billets dans le blog
    6
    Par défaut
    Faites une inéqui autojointure avec comptage. Cela réalise une numération des lignes.

    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
    18
    19
    20
    21
    22
    CREATE TABLE T_NUM
    (COL VARCHAR(8))
     
    INSERT INTO T_NUM VALUES ('dfbsv')
    INSERT INTO T_NUM VALUES ('vsdv')
    INSERT INTO T_NUM VALUES ('sdvsd')
    INSERT INTO T_NUM VALUES ('dv')
    INSERT INTO T_NUM VALUES ('sdvd')
     
    SELECT T1.COL, COUNT(*) AS INCREMENT
    FROM   T_NUM T1
           INNER JOIN T_NUM T2
                 ON T1.COL >= T2.COL
    GROUP  BY T1.COL
     
    COL      INCREMENT   
    -------- ----------- 
    dfbsv    1
    dv       2
    sdvd     3
    sdvsd    4
    vsdv     5
    A +

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    je ne suis pas sur de comprendre votre requête, ou tout du moins je ne pense pas qu'elle réponde à mon besoin ...

    Je ne souhaite pas afficher une numérotation des lignes, je souhaite faire un UPDATE d'une colonne nouvellement ajoutée, dans laquelle je souhaite stocker un ID unique pour chaque ligne.

    Pour cela je souhaite pouvoir faire une opération mathématique sur un certain nombre de colonnes et éventuellement ajouter un nombre en plus si l'opération mathématique donne des doublons :

    je souhaite que pour chaque ligne ColIDX=Combinaison(dePlusieursColonnes)+un nombre externe auto incrémenté.

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    J'imagine que SQLpro vous conseille de faire une requête UPDATE comportant comme sous-requête celle qu'il vous indique permettant de créer une séquence.

  7. #7
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Oui, j'y ai pensé aussi ... mais en fait je ne souhaite pas systematiquement numéroter de 1 à count ... en fait je ne souhaite ajouter la valeur que si certaines conditions sur les autres champs sont remplies et pas forcément depuis 1 mais avec une valeur externe ...

    Je sais que j'en demande beaucoup mais y'a pas un if then else en SQL ?
    Enfin quelque chose qui s'en rapproche ...

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 886
    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 886
    Points : 53 092
    Points
    53 092
    Billets dans le blog
    6
    Par défaut
    mais y'a pas un if then else en SQL ?
    CASE !
    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/sqlaz/select/#L7

    A +

  9. #9
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Merci pour la réponse et Merci pour les articles qui sont vraiment très bien !!!

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 31/03/2011, 20h57
  2. Réponses: 9
    Dernier message: 19/04/2008, 20h37
  3. Réponses: 5
    Dernier message: 23/05/2007, 19h43
  4. Réponses: 5
    Dernier message: 21/05/2006, 13h23
  5. Réponses: 6
    Dernier message: 01/03/2006, 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