2

J'ai la structure suivante des tables dans ma base de données:requête SQL pour une table avec un champ de clé étrangère qui fait référence à d'autres-clés étrangères champs

[table workers] 
ID [PK] | worker | combined [FK] 
--------+--------+--------------+ 
1  | John | 2 
--------------------------------+ 
2  | Adam | 1 

[table combined] 
ID [PK] | name | helper [FK] 
--------+----------------------+ 
1  | name1 | 1 
2  | name2 | 2 

[table helper] 
ID [PK] | department [FK] | location [FK] 
--------+-------------+------------------- 
1  |  2   |  3 
2  |  1   |  1 

[table departments] 
ID [PK] | department 
--------+-------------+ 
1  | Development | 
2  | Production | 

[table location] 
ID [PK] | department 
--------+--------------+ 
1  | Paris  | 
2  | London  | 
3  | Berlin  | 

Le tableau « travailleurs » a un étranger -key-field ("combiné"). La table "combinée" a un nom de champ et un "helper" de champ de clé étrangère qui est encore une table avec deux champs de clé étrangère.

Ma question est maintenant, ce qui est le plus simple requête SQL pour obtenir le tableau suivant:

[table workers] 
ID [PK] | worker | combined-Name| department | location 
--------+--------+--------------+------------+----------- 
1  | John | name2  | Development| Paris 
--------------------------------+------------+----------- 
2  | Adam | name1  | Production | Berlin 

Je l'ai essayé déjà avec quelques GAUCHE REJOINT mais n'a pas réussi à obtenir tous « clearnames » à la table des « travailleurs »

+0

Il n'est pas nécessaire d'interroger les PK et les clés FK. Ce qu'il faut, c'est ce que dit une ligne dans une table (base ou requête). PS Je suppose que par '' clearnames '' vous voulez dire des valeurs non-id. S'il vous plaît faites l'effort d'être clair. S'il vous plaît, surtout, n'utilisez pas les citations alarmistes comme un appel à l'aide lorsque vous dévier cette tâche sur nous. – philipxy

Répondre

1

Cette requête travailleraient:

SELECT w.ID, worker, c.name AS `combined-Name`, d.department, l.department as 
location FROM workers w 
LEFT JOIN combined c ON c.ID = w.combined 
LEFT JOIN helper h ON h.ID = c.helper 
LEFT JOIN departments d ON d.ID = h.department 
LEFT JOIN location l ON l.ID = h.location 
GROUP BY w.ID 

J'ai utilisé le mot-clé AS pour définir les noms à votre sortie préférée.

Ceci a été testé localement en utilisant les structures et les données fournies.

Il s'agit essentiellement de 4 jointures à gauche simples, puis au lieu de sélectionner les ID, je sélectionne les colonnes de nom des tables étrangères.

L'alias sur c.name est cité parce que nous devons échapper au caractère spécial -

-1

utilisation requête suivante:

select [workers].worker,[combined].name as combined-name,[departments].name as department,[location].name as location from [workers] 
left join [combined] on [workers].combined = [combined].combined 
left join [helper] on [helper].ID = [combined].helper 
left join [departments] on [departments].ID = [helper].department 
left join [location] on [location].ID = [helper].location 
+0

Qu'y a-t-il entre les parenthèses autour des noms de tables? C'est assez invalide SQL ... – FMashiro

+0

@FMashiro FYI .. [link] (https://docs.microsoft.com/en-us/sql/relational-databases/databases/database-identifiers) –

+0

Votre code produit un erorr on MySQL, cette question n'est pas destinée MsSQL: 'Caractère inattendu. (près de "[" en position 14) Caractère inattendu. (près de "]" à la position 20) Mot-clé non reconnu. (près de "table" à la position 15) Jeton inattendu. (near "]" à la position 20) Requête SQL: Documentation SELECT * FROM [table] OERE 1 # 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MariaDB pour la bonne syntaxe à utiliser près de '[table] WHERE 1' à la ligne 1' – FMashiro

0

Si vous êtes nouveau à MySQL, vous pouvez utiliser l'outil client MySQL SQLyog qui a Générateur de requêtes qui génère des requêtes à l'aide d'une interface graphique