Insertions et jointures

Insertions et jointures - SQL/NoSQL - Programmation

Marsh Posté le 12-06-2015 à 18:12:02    

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
Reply

Marsh Posté le 12-06-2015 à 18:12:02   

Reply

Marsh Posté le 15-06-2015 à 09:54:33    

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
Reply

Marsh Posté le 15-06-2015 à 22:05:10    

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...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed