REQUETE EN SQL

Bonjour,

Je suis un peu néophyte dans les bases de données et le SQL.

Je souhaiterai faire un projet avec Libre Office Base et le moteur Firebird.

J’ai trois tables dans une base de données pour gérer des représentations par exemple et deux qui servent à lier les entrée n-n. L’idée est à partir d’une représentation, savoir qui était présent et surtout quel rôle elle tenait.

La table ROLES contient la liste des rôles possible.

La table PERSONNES la liste des personnes.

La table LIEN_ROLE permet de lier un personne et un rôle à partir d’une date donnée (je pourrai mettre un date de début et une date de fin mais par simplicité je souhaiterai partir sur la date de nouveau rôle).

L’idée de la requête est donc de sortir le NOM et PRENOM des personnes présentes et le rôle avec la double condition : date la plus grande ET date inférieure à la date de la représentation.

Ex : Sur la représentation de Marseille du 21/09, il y avait Jacques DUPONT qui jouait Lucky Luke depuis le 15/08 (son rôle de Rantanplan du 30/06 ne sort pas)

Dans le fichier joint, les deux rôles sortent avec la requête Test 01.

Merci de toutes les idées.

Essai.odb


LibreOffice Base 6.1.4.2
Windows10

Bonsoir @TPierre

Date la plus grande => fonction d’agrégat MAX sur la base d’un regroupement GROUP BY qui reste à définir : la date est la plus grande par rapport à quel critère : la représentation, c’est à dire la dernière représentation dans laquelle apparaît une personne ou bien par rapport à un rôle…

J’ajoute une sous-requête pour identifier les enregistrements de la table LIEN_ROLE qui correspondent à la demande.

J’ai modifié le type de variable “REPRESENTATION”.“DATE” pour DATE, afin de permettre une relation d’infériorité avec “LIEN_ROLE”.“DATE” qui est une DATE. ATTENTION, la modification du type n’est pas automatique car le champ DATE contient des valeurs qui ne sont pas des dates mais du texte. J’ai donc recopié la table dans Calc, pour me souvenir des valeurs de DATE pour chaque REPRESENTATION et j’ai ensuite recopié les valeurs une à une dans la table de la base.

Je tente une requête, basée sur ma compréhension de la date max:

SELECT "REPRESENTATION"."DATE"
, "REPRESENTATION"."LIEU"
, "PERSONNES"."NOM"
, "PERSONNES"."PRENOM"
, "ROLES"."ROLES" 
FROM (SELECT MAX("LIEN_ROLE"."ID_LIEN_ROLE") AS "ID_LIEN_ROLE", MAX("LIEN_ROLE"."DATE") AS "DATEMAX"
FROM "LIEN_ROLE" 
GROUP BY "LIEN_ROLE"."ID_PERSONNES") AS "TDATEMAX"
INNER JOIN "LIEN_ROLE" ON "TDATEMAX"."ID_LIEN_ROLE" = "LIEN_ROLE"."ID_LIEN_ROLE"
INNER JOIN "ROLES" ON "LIEN_ROLE"."ID_ROLES" = "ROLES"."ID_ROLE"
INNER JOIN "PERSONNES" ON "LIEN_ROLE"."ID_PERSONNES" = "PERSONNES"."ID_NOM"
INNER JOIN "LIEN" ON "LIEN_ROLE"."ID_PERSONNES" = "LIEN"."ID_PERSONNE"
INNER JOIN "REPRESENTATION" ON "LIEN"."ID_REPRESENTATION" = "REPRESENTATION"."ID_REPRESENTATION" 
WHERE "LIEN_ROLE"."DATE" < "REPRESENTATION"."DATE"

Il aurait été plus ergonomique d’uniformiser les dénominations des champs : deux champs qui portent la même information devraient porter le même nom. Eviter par exemple une fois ID_ROLE et ailleurs ID_ROLES. Uniformiser de même le singulier ou le pluriel pour le nom des tables.

Je préfère expliciter les liaisons INNER ou LEFT OUTER mais INNER JOIN est équivalent à votre notation.

Vous pouvez modifier le GROUP BY en choisissant un autre champ : vous obtiendrez un autre résultat. Attention SQL est très puissant mais, comme souvent en informatique, ne vous donne que ce que vous lui avez demandé!

Ci-joint la base de données amendée avec la nouvelle requête: Lien_roles.odb

Pour montrer à la communauté que la question a trouvé sa réponse, cliquez sur ✓ à côté de la “bonne” réponse, et “votez” en cliquant sur la flèche ^ de toute réponse utile. Ce sont les mécanismes utilisés pour communiquer la qualité des questions et réponses sur ce site. Merci!

Merci d’éditer votre question (bouton éditez , en bas de votre question ou simplement ajouter un commentaire à ma réponse. N’utilisez pas une réponse.

Cordialement, Michel

Bonjour,

Il n’y a rien à ajouter !

Tout est parfait, merci beaucoup !

Bonne soirée.

Au plaisir,

Bonne soirée, Michel