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 23/09/2011, 09h38   #1
Invité régulier
 
Marcel Cyrille LAMENU
Inscription : avril 2010
Messages : 30
Détails du profil
Informations personnelles :
Nom : Marcel Cyrille LAMENU

Informations forums :
Inscription : avril 2010
Messages : 30
Points : 5
Points : 5
Par défaut Update Set Select From

Bonjour,

Je veux mettre à jour les champs de mon entrepot de données en utilisant la requête suivante:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
UPDATE dim_address
SET
document_id = Ea.document_id,
document_model = Ea.document_model,
document_label = Ea.document_label,
firstname = Ea.firstname,
lastname = Ea.lastname,
email = Ea.email,
company = Ea.company,
addressline1 = Ea.addressline1,
addressline2 = Ea.addressline2,
addressline3 = Ea.addressline3 ,
zipcode = Ea.zipcode,
city = Ea.city ,
province = Ea.province ,
countryid = Ea.countryid ,
phone = Ea.phone ,
mobilephone = Ea.mobilephone ,
document_modificationdate = getDate()
FROM 
( SELECT
document_id ,
document_model ,
document_label ,
firstname ,
lastname ,
email ,
company , 
addressline1 ,
addressline2 ,
addressline3 ,
zipcode ,
city ,
province ,
countryid ,
phone ,
mobilephone ,
document_creationdate ,
document_modificationdate 
FROM m_customer_doc_address 
WHERE NOT EXISTS (
SELECT 
document_id , 
document_model , 
document_label, 
firstname , 
lastname, 
email, 
company , 
addressline1, 
addressline2 , 
addressline3, 
zipcode , 
city , 
province , 
countryid , 
phone , 
mobilephone, 
document_creationdate, 
document_modificationdate 
 FROM dim_address)) AS Ea, dim_address AS a
WHERE a.document_id = Ea.document_id.
Elle me mets l' erreur suivante au niveau du from ( select : ERROR 1064 <42000> At line 1 : Erreur de syntaxe près de from ( select.

SVP je voudrais savoir si ça ne s’écrit pas en SQL . Pouvez vous me donner une solution?

Merci de votre compréhension.
lamen0031 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 09h43   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Quel est ton SGBD ?

Tu peux faire soit ceci :
Code :
1
2
3
UPDATE une_table
SET une_colonne = une_valeur
WHERE condition
soit cela (mais je crois pas sur tous les SGBD) :
Code :
1
2
3
4
UPDATE une_table t1
INNER JOIN table2 t2 ON condition_de_jointure
SET t1.une_colonne = t2.une_colonne
WHERE condition
EDIT :
Je viens d'examiner ta requête...
Dans la sous-requête qui figure dans le NOT EXISTS, inutile de préciser les colonnes dans le SELECT, c'est le seul cas ou SELECT * est justifié !
En plus, comme tu n'as pas mis de condition dans cette sous requête, le NOT EXISTS sera toujours faux puisqu'il existe des lignes dans la table dim_address.

Depuis 1992, les jointures s'écrivent avec l'opérateur JOIN ; il serait temps de s'y mettre !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 09h59   #3
Invité régulier
 
Marcel Cyrille LAMENU
Inscription : avril 2010
Messages : 30
Détails du profil
Informations personnelles :
Nom : Marcel Cyrille LAMENU

Informations forums :
Inscription : avril 2010
Messages : 30
Points : 5
Points : 5
J'utilise le SGBD MySQL.

Je vais essayé ta proposition pour voir si ça marche.

Merci de ta piste
lamen0031 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 12h05   #4
Invité régulier
 
Marcel Cyrille LAMENU
Inscription : avril 2010
Messages : 30
Détails du profil
Informations personnelles :
Nom : Marcel Cyrille LAMENU

Informations forums :
Inscription : avril 2010
Messages : 30
Points : 5
Points : 5
STP CinePhil, peux tu un peu mieux m'expliquer comment fonctionne le inner join.

En effet, dans mon cas, à ce que j'ai compris, voici la requête que j'écris et ça ne marche toujours pas.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
UPDATE dim_address a
 
INNER JOIN production.m_customer_doc_address m ON 
(a.document_id = m.document_id ,
a.document_model = m.document_model ,
a.document_label = m.document_label,
a.firstname = m.firstname , 
a.lastname = m.lastname, 
a.email = m.email, 
a.company = m.company ,
a.addressline1 = m.addressline1, 
a.addressline2 = m.addressline2 ,
a.addressline3 = m.addressline3, 
a.zipcode = m.zipcode , 
a.city = m.city , 
a.province = m.province ,
a.countryid = m.countryid , 
a.phone = m.phone , 
a.mobilephone = m.mobilephone,
a.document_creationdate = m.document_creationdate, 
a.document_modificationdate = m.document_modificationdate )
 
SET
document_id = document_id,
document_model = document_model,
document_label = document_label,
firstname = firstname,
lastname = lastname,
email = email,
company = company,
addressline1 = addressline1,
addressline2 = addressline2,
addressline3 = addressline3 ,
zipcode = zipcode,
city = city ,
province = province ,
countryid = countryid ,
phone = phone ,
mobilephone = mobilephone ,
document_modificationdate = getDate()
 
WHERE a.document_id = Ea.document_id
Peux tu encore plus m'expliquer? Merci de ta compréhension.
lamen0031 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 13h43   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Tu peux donner la structure des tables dim_address et m_customer_doc_address ?
S'il y a vraiment les mêmes colonnes dans les deux tables, ta BDD est mal modélisée.

Dans ta dernière requête, le WHERE est inutile ; d'ailleurs, l'alias ea n'existe pas dans la requête.

Dans la partie SET, il faut mettre les alias de tables sinon le SGBD ne va pas forcément savoir si tu veux remplacer la valeur existante par elle-même ou si tu veux affecter la valeur d'une table à l'autre.

Plutôt que getDate(), il vaut mieux utiliser CURRENT_DATE qui est du SQL standard.

Bref, j'ai l'impression que tu as besoin de cours SQL.

Le principe de la jointure est qu'on joint des tables entre elles sur une condition de jointure qui porte sur une ou plusieurs informations communes, en principe la clé primaire d'une table qui se retrouve clé étrangère dans l'autre table.

Exemple :
Règle de gestion :
Une entreprise a de une à plusieurs adresses et une adresse n'appartient qu'à une seule entreprise.

MCD (méthode Merise) :
entreprise -1,n----avoir----1,1- adresse -1,1----situer----0,n- ville

Tables :
entreprise (ent_id, ent_nom...)
ville (vil_id, vil_nom...)
adresse (adr_id, adr_id_entreprise, adr_id_ville, adr_rue, adr_code_postal)

On aurait pu même faire mieux que ça mais c'est juste un exemple.

Quelles sont les adresses de l'entreprise X ?
Code :
1
2
3
4
SELECT a.adr_rue, a.adr_code_postal, v.vil_nom
FROM adresse a
INNER JOIN entreprise e ON e.ent_id = a.adr_id_entreprise
INNER JOIN ville v ON v.vil_id = a.adr_id_ville
Si j'ai fait une faute en saisissant la partie rue de l'adresse, je peux la modifier ainsi :
Code :
1
2
3
4
5
6
UPDATE adresse a
INNER JOIN entreprise e ON e.ent_id = a.adr_id_entreprise
SET a.adr_rue = '1bis rue nouvelle'
WHERE e.ent_nom = 'Dupont SA'
  AND a.adr_rue = '1 rue ancienne'
  AND a.adr_code_postal = '31000'
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 13h55   #6
Invité régulier
 
Marcel Cyrille LAMENU
Inscription : avril 2010
Messages : 30
Détails du profil
Informations personnelles :
Nom : Marcel Cyrille LAMENU

Informations forums :
Inscription : avril 2010
Messages : 30
Points : 5
Points : 5
Voici la structure de la table dim_address:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
CREATE TABLE `dim_address` (
  `address_sk` int(11) NOT NULL AUTO_INCREMENT,
  `document_id` int(11) DEFAULT NULL,
  `document_model` varchar(255) DEFAULT NULL,
  `document_label` varchar(255) DEFAULT NULL,
  `firstname` varchar(255) DEFAULT NULL,
  `lastname` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `company` varchar(50) DEFAULT NULL,
  `addressline1` varchar(255) DEFAULT NULL,
  `addressline2` varchar(255) DEFAULT NULL,
  `addressline3` varchar(50) DEFAULT NULL,
  `zipcode` varchar(255) DEFAULT NULL,
  `city` varchar(255) DEFAULT NULL,
  `province` varchar(255) DEFAULT NULL,
  `countryid` int(11) DEFAULT NULL,
  `phone` varchar(255) DEFAULT NULL,
  `mobilephone` varchar(255) DEFAULT NULL,
  `document_creationdate` date DEFAULT NULL,
  `document_modificationdate` date DEFAULT NULL,
  `creationDWdate` date DEFAULT NULL,
  `modificationDWdate` date DEFAULT NULL,
  `suppressionDWdate` date DEFAULT NULL,
  `debutvalidite` date DEFAULT NULL,
  `finvalidite` date DEFAULT NULL,
  `isactive` int(2) DEFAULT NULL,
  PRIMARY KEY (`address_sk`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 ;
Quant à la structure de la table m_customer_doc_address , j'extrais les informations de cette table pour remplir la dim_address moins les champs _sk et les derniers champs. Ses informations sont donc:
- `document_id`
- `document_model`
- `document_label`
- `firstname`
- `lastname`
- `email`
- `company`
- `addressline1`
- `addressline2`
- `addressline3`
- `zipcode`
- `city`
- `province`
- `countryid`
- `phone`
- `mobilephone`
- `document_creationdate`
- `document_modificationdate`

Merci de ta compréhension.
lamen0031 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 14h06   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Depuis le début de la discussion, on parle d'UPDATE (mise à jour)...
Citation:
j'extrais les informations de cette table pour remplir la dim_address
Tu veux remplir la table (insérer des lignes) ou mettre à jour la table (modifier les lignes existantes) ?

VARCHAR(255) pour la plupart des colonnes qui sont affublées de ce type, c'est largement dimensionné !

Puisqu'il y a un document_id qui semble donc être une clé étrangère, il ne devrait pas y avoir document_label et document_model qui semblent être des propriétés du document ; on peut les retrouver par jointure avec la table des documents.

N'as-tu pas une table des personnes et des compagnies ? Il faudrait plutôt ici une clé étrangère comme je l'ai fait dans mon exemple du message précédent.

La city devrait être externalisée dans une table de référence des villes.

Il y a aussi redondance de données puisque figurent à la fois city, countryid et province. Tout devrait se déduire par jointure à partir de l'identifiant de la city.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 14h16   #8
Invité régulier
 
Marcel Cyrille LAMENU
Inscription : avril 2010
Messages : 30
Détails du profil
Informations personnelles :
Nom : Marcel Cyrille LAMENU

Informations forums :
Inscription : avril 2010
Messages : 30
Points : 5
Points : 5
J'utilise la structure d'une base de données en place pour construire mon entrepôt de données (datawarehouse). J'ai déjà extrait les informations que j'ai mis dans dim_address.

Et maintenant, je veux mettre à jour les champs qui ont changé dans ma table de production (m_customer_doc_address).

C'est donc une mise à jour de l’entrepôt de données (dim_address) que je suis en train de faire.

Je m'explique: Supposons que la ville du client change. Si on lance la mise à jour, elle doit pouvoir comparer les champs correspondants (entre la base de production et l'entrepôt) et, le cas échéant, changer l'ancienne valeur par la nouvelle valeur (le changement se fait donc dans l’entrepôt vu que il a été modifié dans la base de production par l'utilisateur. Voilà un peu le problème que je veux résoudre.

Merci de votre compréhension.
lamen0031 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 20h23.


 
 
 
 
Partenaires

Hébergement Web