Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 27/06/2011, 12h54   #1
Candidat au titre de Membre du Club
 
Homme Arnaud
Étudiant
Inscription : mars 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 60
Points : 11
Points : 11
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
bibouex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 14h01   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
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 :
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 :
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
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 19h05   #3
Candidat au titre de Membre du Club
 
Homme Arnaud
Étudiant
Inscription : mars 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 60
Points : 11
Points : 11
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.
bibouex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 20h38   #4
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
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.

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 09h43   #5
Candidat au titre de Membre du Club
 
Homme Arnaud
Étudiant
Inscription : mars 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 60
Points : 11
Points : 11
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 :
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 :
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 :
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...
bibouex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 10h32   #6
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Citation:
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 ?

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 11h26   #7
Candidat au titre de Membre du Club
 
Homme Arnaud
Étudiant
Inscription : mars 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 60
Points : 11
Points : 11
Code :
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.
En effet ca fonctionne car ma table VENTES à plusieurs FK mais n'est pas référencée par une autre table.

Donc tout va bien en fait ! J'ai pas de problème pour faire mon DELETE ni mon TRUNCATE tout fonctionne parfaitement
Désolé...

Par contre pour l'histoire de mes SIREN à 000000000.
J'ai modifié se que j'avais dit un peu plus haut puisque j'ai comparé la table TEMP avec ENTREPRISE par le biais du "nom"... J'aime pas trop passé par là car c'est rempli de caractère et mm si c'est "fiable" pour le moment, dans 2 mois au moindre changement de nom ça va tout casser !

Le Siren lui reste donc la valeur sur sauf pour mes Siren à 00000000... Donc l'option de prendre une clés primaire est la bonne sauf que j'ai actuellement :

[TEMP]
--> id_temp = 5
--> nom = entreprise1
--> id_temp = 6
--> nom = entreprise1
--> id_temp = 7
--> nom = entreprise1

[ENTREPRISE]
--> Id_entreprise = 64
--> nom = entreprise1

[VENTES]
--> id_temp = 5
--> nom = entreprise1
--> id_temp = 6
--> nom = entreprise1
--> id_temp = 7
--> nom = entreprise1


En gros ca me refait une sorte de table ENTREPRISE dans ma table VENTES... Limite je pourrais faire une condition sur le JOIN en comparant les Sirens et les Id ??

EDIT : bon j'ai rien dit ca me donne que 24 lignes de crées au lieu des 130 000... lol

Je vois pas comment vous voulez que je fasse
bibouex 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 03h05.


 
 
 
 
Partenaires

Hébergement Web