Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1839 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Insertions et jointures

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Insertions et jointures

n°2260230
saint malo
Posté le 12-06-2015 à 18:12:02  profilanswer
 

Hello,

 

Mettons que j'ai 4 tables dans ma base :
- 'animaux' avec dedans des animaux nommés un par un, et notamment deux colonnes "id_proprietaire" et "id_race"
- 'proprietaires' pour entreproser les noms et infos des propriétaires des animaux. Dans cette table, j'appelle la colonne d'id "id_proprietaire", comme dans la table animaux.
- 'races' (berger allemand, berger des pyrénées, chihuahua, etc) avec dedans notamment une colonne id_espece. Dans cette table, j'appelle la colonne d'id "id_race", comme dans la table animaux.
- 'especes' (chien, chat, tortue, etc). Dans cette table, j'appelle la colonne d'id "id_espece", comme dans la table races.

 

J'ai deux questions :

 

1) Mettons que je veuille ajouter dans ma table animaux un nouvel animal, dont je connais le nom du propriétaire, la race et l'espèce, mais je ne connais pas les id correspondants à ces infos dans les autres tables. D'après ce que j'ai pu trouver sur internet, je peux faire des espèces de jointures lors des insertions, mais est-ce que je peux faire ça deux fois d'un seul coup ou est-ce qu'il faut découper ? Autrement dit, est-ce que ce genre de requête est valide :

 

INSERT INTO animaux (nom, age, id_proprietaire, id_race)
SELECT 'Rantanplan', '12', id AS id_proprietaire, id AS id_race
FROM races WHERE race = 'berger allemand'
FROM proprietaires WHERE nom_proprietaire = 'Jean Dupont';

 

Si c'est faisable comme ça, je ne suis pas sur de bien comprendre la syntaxe, donc est-ce qu'elle est correcte, et est-ce que l'ordre des deux dernières lignes importe (là j'ai volontairement inversé par rapport à l'ordre dans le SELECT, ça fonctionnera ?)

 

Edit : bon en fait j'ai fini par trouver seul ma réponse et visiblement, je ne peux pas supprimer le sujet, donc autant donner la solution :

 

INSERT INTO animaux (nom, age, id_proprietaire, id_race)
SELECT
'Rantanplan',
'12',
(SELECT id_proprietaire FROM proprietaires WHERE proprietaire = 'Jean Dupont'),
(SELECT id_race FROM races WHERE race = 'berger allemand');


Message édité par saint malo le 14-06-2015 à 03:38:15
mood
Publicité
Posté le 12-06-2015 à 18:12:02  profilanswer
 

n°2260332
TotalRecal​l
Posté le 15-06-2015 à 09:54:33  profilanswer
 

Ta dernière solution fonctionne, la précédente non (syntaxe foireuse).

 

Problème avec la dernière : si l'un des SELECT entre parenthèses renvoie plus d'un résultat tu auras une erreur, idem si 0 et si la colonne ne supporte pas les valeurs nulls.

 

Une autre écriture possible :
INSERT INTO animaux (nom, age, id_proprietaire, id_race)
SELECT top 1
'Rantanplan',
'12',
id_proprietaire,
id_race
from
proprietaires, races
WHERE proprietaire = 'Jean Dupont' and
race = 'berger allemand';

 

C'est plus propre (un seul select pour l'ensemble).

 

Notes
- le top 1 est là par sécurité
- tu pourrais aussi forcer la jointure vers Espece pour être sûr que ta race appartient bien à l'espèce chien.
- attention, tels quels tes tests d'égalité sont sensibles à la casse. Si ta race s'appelait "Berger allemand" ça ne fonctionnerait pas.


Message édité par TotalRecall le 15-06-2015 à 09:55:54

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2260381
Tibar
Posté le 15-06-2015 à 22:05:10  profilanswer
 

Salut,
 
Ca fonctionne mais ce n'est quand même pas très propre, imagine que la race soit 'cheval d'irlande', déjà tu risque de galérer avec les " ' " dans tes libellés, ensuite comme le dit TotalRecall, tu risques d'avoir régulièrement des erreurs sur les libellés saisis, c'est pour ça que sur les sites, tu as très souvent des menus déroulants fixes (là tu aurais ESPECE, puis RACE) ou un champ de recherche libre dans lequel tu rentres "berger allemand" et qui te retourne les bonnes valeurs...
Ta solution va fonctionner mais à l'usage ça risque d'être assez compliqué à gérer, par exemple si la personne rentre "Persan", ce qualificatif peut s'appliquer à un cheval ou à un chat, je pense que ça peut faire une différence...
Pour "fignoler" un peu, tu peux envisager une interface d'admin qui te permet de créer des espèces et des races associées...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Insertions et jointures

 

Sujets relatifs
Requete avec jointures compliquée pour un newbenavigation via pointeurs ou jointures
Difficultés Mysql[Résolu] Besoin petite aide sql (jointures)
[MySQL] Indexes et jointures : optimiser les perfsLinq2entities, jointures multiples
Les triggers: tester si les insertions n'ont pas dépassé une limite[RESOLU] [MySQL] Jointures sur 3 tables
Recuperer les insertions récentes dans une tablePlusieurs insertions (insert + select) dans une meme requête
Plus de sujets relatifs à : Insertions et jointures



Copyright © 1997-2016 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR