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 :

Relation entre les tables


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2011
    Messages : 60
    Par défaut Relation entre les tables
    Bonjour à tous,

    Je suis actuellement dans l'incapacité de concevoir la manière dont je dois procéder afin de lier mes données entre deux tables par exemple...

    Je m'explique, j'ai dans mon cas un table ENTREPRISES qui contient les champs :

    • id_entreprise, siren et nom


    J'ai une deuxième table VENTE qui contient les champs :

    • id_vente, id_entreprise, type_vente, date et montant


    Donc j'ai bien mis mes PK et FK entre les deux, tout va bien jusque là sauf que...

    A la base, j'ai un fichier txt que j'ai importé dans sa totalité dans une table temporaire. Ce fichier est constitué de la manière suivante :

    Siren, Nom, adresse, type_vente, date, montant

    000000001, entreprise 1 , adresse1, type1, 10/03/2011, 100
    000000001, entreprise 1 , adresse1, type1, 11/03/2011, 200
    000000001, entreprise 1 , adresse1, type2, 13/06/2011, 50
    000000002, entreprise 2 , adresse2, type2, 20/02/2011, 158
    000000002, entreprise 2 , adresse2, type1, 20/02/2011, 300
    ...

    La suite c'est la même avec des centaines de milliers de lignes...
    Donc après avoir dé doublonné ma table temporaire pour insérer qu'une seule fois dans ENTREPRISE, l'entreprise1 par exemple. Je souhaiterai maintenant insérer l'autre partie des mes informations tout en faisant les correspondance entre les deux !

    Dans la table ENTREPRISES :

    id_entreprise, siren, nom, adresse
    01, 000000001, entreprise 1 , adresse1
    02, 000000002, entreprise 2 , adresse2
    ...

    Dans la table VENTES :
    id_vente, id_entreprise, type_vente, date, montant
    01, 01, type1, 10/03/2011, 100
    02, 01, type1, 11/03/2011, 200
    03, 01, type2, 13/06/2011, 50
    04, 02, type2, 20/02/2011, 158
    05, 02, type1, 20/02/2011, 300
    ...


    Je crois que mon explication est assez clair, comment je dois gérer la correspondance automatique entre mes deux tables ?
    Je sais pas si c'est la bonne question à ma demande...

    Merci d'avance de m'éclairer

  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 : 44
    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
    Par défaut
    Bonjour,

    IL vous faut dans un premier temps ajouter à la table ENTREPRISES les entreprises que vous n'auriez pas déjà enregistrées en base de données.
    Je suppose ici que l'id_entreprise est une clé entière avec la propriété d'auto-incrémentation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    INSERT	INTO dbo.ENTREPRISES
    (
    	siren
    	, nom
    	, addresse
    )
    SELECT		DISTINCT MTT.siren
    		, MTT.nom
    		, MTT.adresse
    FROM		dbo.maTableTemporaire AS MTT
    LEFT JOIN	dbo.ENTREPRISES AS E
    			ON MIT.siren = E.siren
    WHERE		E.siren IS NULL
    Une fois cela fait, il ne reste plus qu'à réaliser la jointure sur le SIREN pour l'insertion dans la table des ventes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    INSERT	INTO dbo.Ventes
    (
    	id_entreprise
    	, type_vente
    	, date
    	, montant
    )
    SELECT		E.id_entreprise
    		, MTT.type_vente
    		, MTT.date
    		, MTT.montant
    FROM		dbo.maTableTemporaire AS MTT
    INNER JOIN	dbo.ENTREPRISES AS E
    			ON MIT.siren = E.siren
    @++

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2011
    Messages : 60
    Par défaut
    Ouahhh c'est formidable ce que vous venez de me mettre là !

    Y a juste un petit hic ! En faite dans ma table ENTREPRISE le Siren est à 000000000 pour les entreprises étrangère càd que si je reprend mon exemple :

    Siren, Nom, adresse, type_vente, date, montant

    000000000, entreprise 1 , adresse1, type1, 10/03/2011, 100
    000000000, entreprise 1 , adresse1, type1, 11/03/2011, 200
    000000000, entreprise 1 , adresse1, type2, 13/06/2011, 50
    000000000, entreprise 2 , adresse2, type2, 20/02/2011, 158
    000000000, entreprise 2 , adresse2, type1, 20/02/2011, 300
    ...

    Qu'est ce que je pourrai faire afin de remédier à se problème ? Car lors de l’exécution des requêtes ci dessus, forcement il fait de mauvaises insertions puisqu'il se base sur le Siren... étant donné qu'ils sont tous à 0 pour qq entreprises mes jointures ne sont pas bonnes.


    Le dé doublonnement en revanche lors de l’exécution de la première requête marche à la perfection puisque j’obtiens bien un seul et unique Siren à 00000000 pour une entreprise.

  4. #4
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Dans ce cas la colonne no siren ne peut pas être candidate en tant que clé primaire. Il faudra ajouter une colonne auto incrémentée par exemple pour rendre vos tuples uniques.

    ++

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2011
    Messages : 60
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Dans ce cas la colonne no siren ne peut pas être candidate en tant que clé primaire. Il faudra ajouter une colonne auto incrémentée par exemple pour rendre vos tuples uniques.

    ++
    Merci, mais c'est ce qu'il se passe dans ma table ENTREPRISES j'ai une clé primaire auto incrémentée sur id_entreprise

    Donc ca donnerai, pour la deuxième requête :

    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
     
    INSERT	INTO dbo.Ventes
    (
    	id_entreprise
    	, type_vente
    	, date
    	, montant
    )
    SELECT		E.id_entreprise
    		, MTT.type_vente
    		, MTT.date
    		, MTT.montant
    FROM		dbo.maTableTemporaire AS MTT
    INNER JOIN	dbo.ENTREPRISES AS E
    			ON MIT.id_entreprise = E.id_entreprise
    Je ne doit plus comparer avec le siren mais uniquement l'id_entreprise


    Je rajoute une question, car j'avis déjà pas mal chercher et je m'aperçois que ca ne fonctionne toujours pas... Je souhaiterai remettre à 1 mon compteur lorsque je vide ma table.

    J'ai bien compris la différence entre le DELETE et le TRUNCATE (mm si cette derniere ne marche pas car mes tables sont liées à d'autres...)
    Pour ce qui est du reseed à 1 ca ne fonctionne pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    USE [Ma_BDD]
    DBCC CHECKIDENT ("[Ma_BDD][dbo].VENTES.Id_ventes",RESEED,0)
    C'est pas un truc du style qu'il faut faire ?


    EDIT :

    Je laisse mon erreur au cas ou... Il ne pas mettre tout le chemin d'accès à la base mais uniquement la table !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DBCC CHECKIDENT('nom_table', RESEED, NouvelleValeur)
     
    Soit dans mon cas :
     
    USE [Ma_BDD]
    DBCC CHECKIDENT ("VENTES",RESEED,0)
    Pardonnez moi mon ignorance...

  6. #6
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    J'ai bien compris la différence entre le DELETE et le TRUNCATE (mm si cette derniere ne marche pas car mes tables sont liées à d'autres...)
    Tout dépend .. vous pouvez tout à faite effectuer un TRUNCATE sur une table qui est "liée" mais qui n'est pas référencée par une autre table.

    Votre table vente (que vous voulez vider ??? dans votre exemple) est-elle référencée ailleurs ?

    ++

Discussions similaires

  1. Créer et effacer les relations entre les tables en VB
    Par polianita dans le forum Access
    Réponses: 7
    Dernier message: 04/08/2006, 11h54
  2. [MySQL] aide pour MyAdmin-relation entre les tables
    Par bucarest dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 13/04/2006, 13h35
  3. Pourquoi les relations entre les tables
    Par ghita269 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/12/2005, 11h54
  4. Relation entre les tables
    Par mzt.insat dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 14/11/2005, 08h17
  5. Relation entre les tables
    Par adelyx dans le forum Bases de données
    Réponses: 1
    Dernier message: 02/04/2005, 23h06

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