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 :

Echange de données dans la même table


Sujet :

Langage SQL

  1. #1
    Membre actif Avatar de roots_man
    Inscrit en
    Août 2004
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 328
    Points : 282
    Points
    282
    Par défaut Echange de données dans la même table
    Bonjour,

    Je vous présent mon problème à l'aide d'un exemple concret. C'est en fait un horaire de train. J'ai 3 tables.
    Table Train
    =========
    idTrain
    nomTrain

    Table HeureDepart
    =================
    idHeureDepart
    heureDepart

    Table Ligne (intermédiaire entre les 2)
    ===========
    nomLigne
    train_idTrain
    heureDepart_idHeureDepart
    Ces tables sont remplies de manière suivante :
    Train
    ===
    1->Train1
    2->Train2
    3->TrainTemporaire

    HeureDepart
    ===========
    1->10:00
    2->11:00
    3->12:00
    4->13:00

    Ligne
    =====
    Ligne1->1->1
    Ligne1->1->3
    Ligne2->2->2
    Ligne2->2->4
    Ce qui signifie que le Train1 fait la Ligne1 avec les HeureDepart(10:00 et 12:00) et les Train2 fait la Ligne2 avec les HeureDepart(11:00 et 13:00).

    Ce que je souhaite c'est pouvoir en quelque requetes, allouer une nouvelle ligne à un train. Ce que je fais c'est que j'utilise un train temporaire (3->TrainTemporaire).

    Action 1 : Allouer la Ligne2 au Train1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //Je met le TrainTemporaire a la ligne actuelle du Train1
    UPDATE Ligne SET train_idTrain=3 WHERE train_idTrain=1
    //Je met le Train1 a la place du Train2
    UPDATE Ligne SET train_idTrain=1 WHERE train_idTrain=2
    Ce qui me donne le résultat suivante (table Ligne)
    Ligne
    =====
    Ligne1->3->1
    Ligne1->3->3
    Ligne2->1->2
    Ligne2->1->4
    Si maintenant le Train2 prend la Ligne1 cela fonctionne parfaitement! Mais si le Train1 reprend la Ligne1, les deux lignes seront alloué au Train1 et ca c'est Faux !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //Je met le TrainTemporaire a la ligne actuelle du Train1
    UPDATE Ligne SET train_idTrain=3 WHERE train_idTrain=1 //ca met des 3 partout
    UPDATE Ligne SET train_idTrain=1 WHERE train_idTrain=3 //tous les 3 sont updaté en 1
    Cela retourne
    Ligne
    =====
    Ligne1->1->1
    Ligne1->1->3
    Ligne2->1->2
    Ligne2->1->4
    Et je souhaite obtenir le résultat suivant :
    Ligne
    =====
    Ligne1->1->1
    Ligne1->1->3
    Ligne2->3->2
    Ligne2->3->4
    J'espère avoir été clair et je reste à disposition en cas de questions

    Merci d'avance pour votre réponse

    Bonne journée
    powder skiing is not a crime

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    Et pourquoi n'utilisez vous pas les clauses DELETE et INSERT ?

    edit :
    Si maintenant le Train2 prend la Ligne1 cela fonctionne parfaitement! Mais si le Train1 reprend la Ligne1, les deux lignes seront alloué au Train1 et ca c'est Faux !
    Quel est votre MCD en fait ? Car vu vos tables actuelles cette condition n'a jamais été modélisée si je ne m'abuse ?

  3. #3
    Membre actif Avatar de roots_man
    Inscrit en
    Août 2004
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 328
    Points : 282
    Points
    282
    Par défaut
    En fait l'exemple ci-dessus c'est ma base de données mais très minimisé pour vous expliquer mon problème...

    Je vais essayer ce soir le delete->insert... mais avec ce procédé, il faut quand même que je stocke les données avant de les deleter ? une table temporaire ayant la même structure que ma table Ligne ? ça peut faire l'affaire ??

    Merci
    powder skiing is not a crime

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Quel est le but de cette manip ?
    - process metier à mettre en place ? => vos tables sont mal modélisées, il faudrait repenser la solution si c'est encore possible

    D’après ce que j'ai compris de votre fonctionnel :
    - une ligne est rattachée à un train
    - une ligne dispose d’horaires de départ
    - un train ne peut être rattaché qu'a une seule ligne

    Il vous manque une table relation entre train / ligne avec une contrainte d'unicité sur la colonne d'identifiant du train.. et là vous n'aurez plus ce problème de train rattaché à plusieurs lignes !


    La table ligne est donc à exploser pour gérer vos contraintes fonctionnelles.

    C'est pour ça que je vous demandais d’élaborer un peu votre MCD par rapport à vos contraintes car là vous galérez pour rien.
    De plus si vous avez un peu de concurrence sur cette appli vous n'arriverez pas à avoir des données cohérentes



    edit : Et sinon pour votre problème si vous ne voulez pas toucher à vos table, pourquoi ne faites-vous pas un test avant/après modification pour voir si ce que vous allez faire est valable fonctionnellement ?
    Et faites un rollback de votre transaction ou n’exécutez pas le script d'update le cas échéant.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 769
    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 769
    Points : 52 722
    Points
    52 722
    Billets dans le blog
    5
    Par défaut
    Vous avez effectivement une très mauvaise modélisation.
    Avant tout une base de données se modélise au niveau conceptuel. Jamais au niveau physique !
    Commencez donc pas définir vos entités et vos associations et vous verrez qu'il vous en manque une capitale, la notion de circulation....
    Voici un exemple de MCD Merise pour votre base :
    http://www.developpez.net/forums/att...1&d=1311408303

    Pour un cours sur Merise : http://sqlpro.developpez.com/cours/modelisation/merise/
    Pour comprendre la contrainte de modèle : http://merise.developpez.com/faq/?pa...Conditionnelle

    A +
    Images attachées Images attachées  
    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/ * * * * *

  6. #6
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    roots_man,tu peux ajouter des conditions dans la clause wherecomme;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE Ligne SET train_idTrain=3 
    WHERE train_idTrain=1 and 
    nomLigne='Ligne2'
     
    UPDATE Ligne SET train_idTrain=1 
    WHERE train_idTrain=3 and 
    nomLigne='ligne1'
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

Discussions similaires

  1. enregistrer des données dans la même table
    Par syrine01 dans le forum Langage
    Réponses: 4
    Dernier message: 29/12/2013, 23h06
  2. Dupliquer données dans la même table
    Par czar1983 dans le forum SQL
    Réponses: 8
    Dernier message: 06/11/2013, 23h09
  3. [AC-2010] Comparaison de données dans une même table
    Par ambact dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 06/10/2013, 12h13
  4. Réponses: 1
    Dernier message: 01/05/2008, 08h26
  5. Copie de données dans une même table
    Par Tintou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/07/2007, 17h22

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