Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/07/2011, 10h26   #1
Membre confirmé
 
Avatar de roots_man
 
Inscription : août 2004
Messages : 324
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 324
Points : 227
Points : 227
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.
Citation:
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 :
Citation:
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 :
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)
Citation:
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 :
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
Citation:
Ligne
=====
Ligne1->1->1
Ligne1->1->3
Ligne2->1->2
Ligne2->1->4
Et je souhaite obtenir le résultat suivant :
Citation:
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
roots_man est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 10h38   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
bonjour,

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

edit :
Citation:
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 ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 11h48   #3
Membre confirmé
 
Avatar de roots_man
 
Inscription : août 2004
Messages : 324
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 324
Points : 227
Points : 227
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
roots_man est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 13h15   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
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.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/07/2011, 10h06   #5
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
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
Type de fichier : jpg MCD circulation des trains.jpg (128,0 Ko, 14 affichages)
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/07/2011, 12h42   #6
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
roots_man,tu peux ajouter des conditions dans la clause wherecomme;


Code :
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'
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h33.


 
 
 
 
Partenaires

Hébergement Web