SOLUTIONS
________________________
Requêtes élémentairesRequête!1!: SELECT *
FROM FILM
Requête!2!: SELECT *
FROM FILM
WHERE LONGUEUR > 180
Requête!3!:
SELECT DISTINCT GENRE
FROM FILM
Requête!4!: SELECT TITRE, ANNÉE
FROM FILM
WHERE GENRE = ‘SciFi’
AND BUDGET > 5000000
Requête!5!: SELECT GENRE, COUNT (*)
FROM FILM
GROUP BY GENRE
Requête!6!: SELECT GENRE, COUNT (*)
FROM FILM
WHERE ANNÉE = 1960
GROUP BY GENRE
Requêtes facilesRequête!7!: Forme plate!:
SELECT F.TITRE
FROM FILM F, PERSONNE P
WHERE F.RÉALISATEUR = P.NUMP
AND P.PRÉNOM = ‘Roman’
AND P.NOM = ‘Polanski’
Forme imbriquée!:
SELECT TITRE
FROM FILM
WHERE RÉALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE PRÉNOM = ‘Roman’
AND NOM = ‘Polanski’ )
Requête!8!:
Forme plate :
SELECT PA.PRÉNOM, PA.NOM
FROM PERSONNE PA, DISTRIBUTION D, FILM F, PERSONNE PR
WHERE PA.NUMP = D.NUMA
AND D.SPÉCIALITÉ = ‘Comique’
AND D.NUMF = F.NUMF
AND F.RÉALISATEUR = PR.NUMP
AND PR.NOM = ‘Spielberg’
Forme imbriquée!:
SELECT PRÉNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT NUMA
FROM DISTRIBUTION
WHERE SPÉCIALITÉ = ‘Comique’
AND NUMF IN (
SELECT NUMF
FROM FILM
WHERE RÉALISATEUR IN (
SELECT NUMP
FROMPERSONNE
WHERE NOM = ‘Spielberg’ ) ) )
Requête!9!:
Forme imbriquée!:
SELECT TITRE, ANNÉE
FROM FILM
WHERE LONGUEUR = (
SELECT MAX (LONGUEUR)
FROM FILM )
Requêtes de difficulté moyenneRequête!10!: Forme plate :
SELECT P.PRÉNOM, P.NOM, F.DATE
FROM PERSONNE P, DISTRIBUTION D, FILM F
WHERE P.NUMP = D.NUMA
AND D.RÔLE = ‘Gavroche’
AND G.NUMF = F.NUMF
AND F.TITRE = ‘Les misérables’
Forme imbriquée SQL-92!:
SELECT P.PRÉNOM, P.NOM, F.DATE
FROM PERSONNE P, FILM F
WHERE F.TITRE = ‘Les misérables’
AND (P.NUMP, F.NUMF) IN (
SELECT NUMA, NUMF
FROM DISTRIBUTION
WHERE RÔLE = ‘Gavroche’ )
Requête!11!:
Forme plate :
SELECT DISTINCT P.PRÉNOM, P.NOM
FROM PERSONNE P, FILM F, DISTRIBUTION D
WHERE P.NUMP = F.RÉALISATEUR
AND F.NUMF = D.NUMF
AND D.NUMA = F.RÉALISATEUR
Forme imbriquée SQL-92!:
SELECT DISTINCT PRÉNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT RÉALISATEUR
FROM FILM
WHERE (RÉALISATEUR, NUMF) IN (
SELECT NUMA, NUMF
FROM DISTRIBUTION ) )
Requête!12!:
Seattle!».
Forme plate :
SELECT SUM (D.SALAIRE)
FROM DISTRIBUTION D, FILM F
WHERE DISTRIBUTION.NUMF = F.NUMF
AND F.TITRE = ‘Nuits blanches à Seattle’
Forme imbriquée :
SELECT SUM (SALAIRE)
FROM DISTRIBUTION
WHERE NUMF IN (
SELECT NUMF
FROM FILM
WHERE TITRE = ‘Nuits blanches à Seattle’ )
Requête!13!:
Forme SQL-89 :
SELECT F.TITRE, F.ANNÉE, AVG (D.SALAIRE)
FROM FILM F, DISTRIBUTION D
WHERE F.NUMF = D.NUMF
GROUP BY F.TITRE, F.ANNÉE
Forme SQL-92 :
SELECT F.TITRE, F.ANNÉE, AVG (D.SALAIRE)
FROM FILM F, DISTRIBUTION D
WHERE F.NUMF = D.NUMF
GROUP BY F.NUMF
-- Si NUMF a bien été déclaré clé primaire de la relation FILM
Requête!14!:
SELECT GENRE
FROM FILM
WHERE ANNÉE BETWEEN 1980 AND 1989
GROUP BY GENRE
HAVING AVG (BUDGET) > 200000
Requêtes plus complexesRequête!15!:
Forme plate :
SELECT F.TITRE, F.ANNÉE, SUM (D.SALAIRE)
FROM FILM F, DISTRIBUTION D, PERSONNE P
WHERE F.NUMF = D.NUMF
AND F.RÉALISATEUR = P.NUMP
AND P.NOM = ‘Spielberg’
GROUP BY F.TITRE, F.ANNÉE
Forme imbriquée SQL-89 :
SELECT F.TITRE, F.ANNÉE, SUM (D.SALAIRE)
FROM FILM F, DISTRIBUTION D
WHERE F.NUMF = D.NUMF
AND F.RÉALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE NOM = ‘Spielberg’ )
GROUP BY F.TITRE, F.ANNÉE
Forme imbriquée SQL-92!:
SELECT F.TITRE, F.ANNÉE, X.SUMSAL
FROM FILM F, (
SELECT NUMF, SUM (SALAIRE) AS SUMSAL
FROM DISTRIBUTION
GROUP BY NUMF ) AS X
WHERE F.NUMF = X.NUMF
AND F.RÉALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE NOM = ‘Spielberg’ )
Requête!16!: Forme plate :
SELECT C.NOM, C.VILLE
FROM CINÉMA C, SALLE S
WHERE C.NUMC = S.NUMC
GROUP BY C.NUMC, C.NOM, C.VILLE
HAVING AVG (S.TAILLE_ÉCRAN) > 40 )
Forme imbriquée SQL-92!:
SELECT NOM, VILLE
FROM CINÉMA
WHERE NUMC IN (
SELECT NUMC
FROM SALLE
GROUP BY NUMC
HAVING AVG (TAILLE_ÉCRAN) > 40 )
Requête!17!: Forme plate :
SELECT DISTINCT C.NOM, F.TITRE
FROM CINÉMA C, SALLE S, PASSE P, FILM F, PERSONNE P
WHERE C.COMPAGNIE = ‘Fox’
AND C.VILLE = ‘Paris’
AND C.NUMC = S.NUMC
AND S.NBPLACES >= 200
AND S.TAILLE_ÉCRAN > 30
AND S.NUMC = P.NUMC
AND S.NUMS = P.NUMS
AND P.HORAIRE < ’22!:00’
AND P.NUMF = F.NUMF
AND F.RÉALISATEUR = P.NUMP
AND P.PRÉNOM = ‘Elia’
AND P.NOM = ‘Kazan’
Forme imbriquée SQL-89 :
SELECT DISTINCT C.NOM, F.TITRE
FROM CINÉMA C, SALLE S, PASSE P, FILM F
WHERE C.COMPAGNIE = ‘Fox’
AND C.VILLE = ‘Paris’
AND C.NUMC = S.NUMC
AND S.NBPLACES >= 200
AND S.TAILLE_ÉCRAN > 30
AND S.NUMC = P.NUMC
AND S.NUMS = P.NUMS
AND P.HORAIRE < ’22!:00’
AND P.NUMF = F.NUMF
AND F.RÉALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE PRÉNOM = ‘Elia’
AND NOM = ‘Kazan’ )
Forme imbriquée SQL-92!:
SELECT DISTINCT C.NOM, F.TITRE
FROM CINÉMA C, FILM F
WHERE C.COMPAGNIE = ‘Fox’
AND C.VILLE = ‘Paris’
AND (C.NUMC, F.NUMF) IN (
SELECT S.NUMC, P.NUMF
FROM SALLE S, PASSE P
WHERE S.NBPLACES >= 200
AND S.TAILLE_ÉCRAN > 30
AND S.NUMC = P.NUMC
AND S.NUMS = P.NUMS
AND P.HORAIRE < ’22!:00’ )
AND F.RÉALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE PRÉNOM = ‘Elia’
AND NOM = ‘Kazan’ )
Requête!18!: On commence par poser la requête inverse!: les films qui passent dans un (au moins) cinéma de la Fox.
Forme plate : pour trouver ceux qui passent dans un cinéma de la Fox
SELECT DISTINCT F.NUMF, F.TITRE
FROM FILM F, PASSE P, CINÉMA C
WHERE F.NUMF = P.NUMF
AND P.NUMC = C.NUMC
AND C.COMPAGNIE = ‘Fox’
Forme imbriquée 1 – prédicat IN : pour trouver ceux qui passent dans un cinéma de la Fox
SELECT DISTINCT NUMF, TITRE
FROM FILM
WHERE NUMF IN (
SELECT NUMF
FROM PASSE
WHERE NUMC IN (
SELECT NUMC
FROM CINÉMA
WHERE COMPAGNIE = ‘Fox’ ) )
Forme imbriquée 2 – prédicat EXISTS : toujours pour trouver ceux qui passent dans un cinéma de la Fox
SELECT DISTINCT NUMF, TITRE
FROM FILM F
WHERE EXISTS (
SELECT *
FROM PASSE P
WHERE P.NUMF = F.NUMF
AND EXISTS (
SELECT *
FROM CINÉMA C
WHERE C.NUMC = P.NUMC
AND COMPAGNIE = ‘Fox’ ) )
SELECT DISTINCT NUMF, TITRE
FROM FILM
WHERE NUMF NOT IN (
SELECT NUMF
FROM PASSE
WHERE NUMC IN (
SELECT NUMC
FROM CINÉMA
WHERE COMPAGNIE = ‘Fox’ ) )
Forme imbriquée 2 – prédicat NOT EXISTS : pour trouver ceux qui ne passent dans aucun cinéma de la Fox
SELECT DISTINCT NUMF, TITRE
FROM FILM F
WHERE NOT EXISTS (
SELECT *
FROM PASSE P
WHERE P.NUMF = F.NUMF
AND EXISTS (
SELECT *
FROM CINÉMA C
WHERE C.NUMC = P.NUMC
AND COMPAGNIE = ‘Fox’ ) )
Pour finalement arriver à la forme la plus simple, où seul le prédicat NOT EXISTS provoque un niveau d’imbrication.
Forme 3 – prédicat NOT EXISTS uniquement :
SELECT DISTINCT NUMF, TITRE
FROM FILM F
WHERE NOT EXISTS (
SELECT *
FROM PASSE P, CINÉMA C
WHERE F.NUMF = P.NUMF
AND P.NUMC = C.NUMC
AND COMPAGNIE = ‘Fox’ )
Forme complète :
SELECT DISTINCT NUMF, TITRE
FROM FILM F
WHERE NUMF IN (
SELECT NUMF
FROM PASSE )
AND NOT EXISTS (
SELECT *
FROM PASSE P, CINÉMA C
WHERE F.NUMF = P.NUMF
AND P.NUMC = C.NUMC
AND COMPAGNIE = ‘Fox’ )
Requête!19!:
Forme plate :
SELECT PA.PRÉNOM, PA.NOM
FROM PERSONNE PA, DISTRIBUTION D, FILM F
WHERE PA.NUMP = D.NUMA
AND D.NUMF = F.NUMF
AND D.SALAIRE > F.SALAIRE_RÉAL
Forme imbriquée 1 :
SELECT PRÉNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT D.NUMA
FROM DISTRIBUTION D, FILM F
WHERE D.NUMF = F.NUMF
AND D.SALAIRE > F.SALAIRE_RÉAL )
Forme imbriquée 2!:
SELECT PRÉNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT NUMA
FROM DISTRIBUTION D
WHERE D.SALAIRE > (
SELECT F.SALAIRE_RÉAL
FROM FILM F
WHERE D.NUMF = F.NUMF ) )
Forme imbriquée SQL-89 :
SELECT DISTINCT PA.PRÉNOM, PA.NOM
FROM PERSONNE PA, DISTRIBUTION D
WHERE PA.NUMP = D.NUMA
GROUP BY D.NUMA, D.NUMF, PA.PRÉNOM, PA.NOM
HAVING SUM (SALAIRE) > (
SELECT SALAIRE_RÉAL
FROM FILM F
WHERE D.NUMF = F.NUMF ) )
Forme imbriquée SQL-92 :
SELECT PRÉNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT NUMA
FROM DISTRIBUTION D
GROUP BY NUMA, NUMF
HAVING SUM (SALAIRE) > (
SELECT SALAIRE_RÉAL
FROM FILM F
WHERE D.NUMF = F.NUMF ) )
Requêtes difficilesRequête!20!:
Forme plate :
SELECT DISTINCT P1.PRÉNOM, P1.NOM, P2.PRÉNOM, P2.NOM
FROM PERSONNE P1, PERSONNE P2, FILM F1, FILM F2, DISTRIBUTION D1, DISTRIBUTION D2
WHERE P1.NUMP > P2.NUMP
-- PERMET D’ÉLIMINER DEUX PROBLÈMES!:
-- LISTER UN COUPLE (P1, P2) UNE SEULE FOIS
-- DANS UN SEUL ORDRE
-- ÉLIMINER LE CAS DES RÉALISATEURS QUI ONT JOUÉ
-- DANS LEUR PROPRE FILM
AND P1.NUMP = F1.RÉALISATEUR
AND P2.NUMP = F2.RÉALISATEUR
AND F1.NUMF = D1.NUMF
AND D1.NUMA = F2.RÉALISATEUR
AND F2.NUMF = D2.NUMF
AND D2.NUMA = F1.RÉALISATEUR
Forme imbriquée SQL-92!:
SELECT DISTINCT P1.PRÉNOM, P1.NOM, P2.PRÉNOM, P2.NOM
FROM PERSONNE P1, PERSONNE P2
WHERE (P1.NUMP, P2.NUMP) IN (
SELECT F1.RÉALISATEUR, F2.RÉALISATEUR
FROM FILM F1, FILM F2, DISTRIBUTION D1,
DISTRIBUTION D2
WHERE F1.RÉALISATEUR > F2.RÉALISATEUR
-- PERMET D’ÉLIMINER DEUX PROBLÈMES!:
-- LISTER UN COUPLE (RÉAL1, RÉAL2) UNE SEULE FOIS
-- DANS UN SEUL ORDRE
-- ÉLIMINER LE CAS DES RÉALISATEURS QUI ONT JOUÉ
-- DANS LEUR PROPRE FILM
AND F1.NUMF = D1.NUMF
AND D1.NUMA = F2.RÉALISATEUR
AND F2.NUMF = D2.NUMF
AND D2.NUMA = F1.RÉALISATEUR )
Requête!21!:
SELECT NOM, PRÉNOM
FROM PERSONNE P
WHERE EXISTS (
SELECT *
FROM FILM F
WHERE RÉALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE NOM = ‘Lelouch’ )
AND EXISTS (
SELECT *
FROM DISTRIBUTION D
WHERE D.NUMF = F.NUMF
AND D.NUMA = P.NUMP ) )
Il ne reste plus alors qu’à introduire les deux négations pour obtenir la requête souhaitée.
Forme imbriquée – prédicat NOT EXISTS : «!dans tous les films!»
SELECT NOM, PRÉNOM, NUMP
FROM PERSONNE P
WHERE NOT EXISTS (
SELECT *
FROM FILM F
WHERE RÉALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE NOM = ‘Lelouch’ )
AND NOT EXISTS (
SELECT *
FROM DISTRIBUTION D
WHERE D.NUMF = F.NUMF
AND D.NUMA = P.NUMP ) )
Requête!22!:
Forme imbriquée – prédicat NOT EXISTS : un seul rôle par acteur
SELECT F.TITRE, PA.PRÉNOM, PA.NOM
FROM FILM F, DISTRIBUTION D1, PERSONNE PA
WHERE F.NUMF = D1.NUMF
AND D1.NUMA = PA.NUMP
AND RÉALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE NOM = ‘Bergman’ )
AND NOT EXISTS (
SELECT *
FROM DISTRIBUTION D2
WHERE D2.NUMF = D1.NUMF
AND D2.SALAIRE > D1.SALAIRE )
SELECT F.TITRE, PA.PRÉNOM, PA.NOM
FROM FILM F, DISTRIBUTION D1, PERSONNE PA
WHERE F.NUMF = D1.NUMF
AND D1.NUMA = PA.NUMP
AND RÉALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE NOM = ‘Bergman’ )
GROUP BY D1.NUMF, D1.NUMA, F.TITRE, PA.PRÉNOM, PA.NOM
HAVING SUM (SALAIRE) > ALL (
SELECT SUM (SALAIRE)
FROM DISTRIBUTION D2
WHERE D2.NUMF = D1.NUMF
AND D2.NUMA <> D1.NUMA
GROUP BY D2.NUMA )
Forme imbriquée SQL-92 : possibilité de plusieurs rôles pour un même acteur
SELECT F.TITRE, PA.PRÉNOM, PA.NOM
FROM FILM F, PERSONNE PA
WHERE (F.NUMF, PA.NUMP) IN (
SELECT D1.NUMF, D1.NUMA
FROM DISTRIBUTION D1
WHERE D1.NUMF IN (
SELECT NUMF
FROM FILM
WHERE RÉALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE NOM = ‘Bergman’ ) )
GROUP BY D1.NUMF, D1.NUMA
HAVING SUM (D1.SALAIRE) = (
SELECT MAX (
SELECT SUM (D2.SALAIRE)
FROM DISTRIBUTION D2
WHERE D2.NUMF = D1.NUMF
GROUP BY D2.NUMA ) )
Utilisation d’une vue groupée SQL-92!:
CREATE VIEW SALAIRE_TOTAL_ACTEUR_FILM
(NUMA, NUMF, SALAIRE_TOTAL)
AS SELECT NUMA, NUMF, SUM (SALAIRE)
FROM FILM
GROUP BY NUMA, NUMF
SELECT F.TITRE, PA.PRÉNOM, PA.NOM
FROM FILM F, SALAIRE_TOTAL_ACTEUR_FILM D1, PERSONNE PA
WHERE F.NUMF = D1.NUMF
AND D1.NUMA = PA.NUMP
AND RÉALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE NOM = ‘Bergman’ )
AND NOT EXISTS (
SELECT *
FROM SALAIRE_TOTAL_ACTEUR_FILM D2
WHERE D2.NUMF = D1.NUMF
AND D2.SALAIRE_TOTAL > D1.SALAIRE_TOTAL )
Requête!23!:
Forme imbriquée :
SELECT PRÉNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT RÉALISATEUR
FROM FILM F
WHERE SALAIRE_RÉAL > (
SELECT MAX (SALAIRE)
FROM DISTRIBUTION D
WHERE D.NUMF = F.NUMF ) )
Hypothèse 2!: un acteur peut jouer plusieurs rôles, le réalisateur ne joue pas dans le film correspondant.
Forme imbriquée :
SELECT PRÉNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT RÉALISATEUR
FROM FILM F
WHERE SALAIRE_RÉAL > ALL (
SELECT SUM (SALAIRE)
FROM DISTRIBUTION D
WHERE D.NUMF = F.NUMF
GROUP BY NUMA ) )
Hypothèse 3!: Tout acteur – y compris le réalisateur s’il joue dans le film correspondant – peut jouer plusieurs rôles.
Forme imbriquée SQL-92 :
SELECT PRÉNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT RÉALISATEUR
FROM FILM F
WHERE SALAIRE_RÉAL
+ (
SELECT SUM (SALAIRE)
FROM DISTRIBUTION D1
WHERE D1.NUMF = F.NUMF
AND D1.NUMA = F.RÉALISATEUR )
> (
SELECT MAX (
SELECT SUM (SALAIRE)
FROM DISTRIBUTION D2
WHERE D2.NUMF = F.NUMF
GROUP BY D2.NUMA ) ) )
Schéma complémentaire
RÉCOMPENSE (NUMR, CATÉGORIE, FESTIVAL)
RÉCOMPENSE_FILM (NUMF, ANNÉE, NUMR)
RÉCOMPENSE_ACTEUR (NUMA, NUMF, ANNÉE, NUMR)
Requête de difficulté moyenneRequête!24!: Forme plate SQL-89 :
SELECT DISTINCT F.TITRE, F.ANNÉE
FROM FILM F, RÉCOMPENSE_FILM RF
WHERE F.NUMF = RF.NUMF
UNION
SELECT DISTINCT F.TITRE, F.ANNÉE
FROM FILM F, RÉCOMPENSE_ACTEUR RA
WHERE F.NUMF = RA.NUMF
Forme imbriquée SQL-92 :
SELECT TITRE, ANNÉE
FROM FILM
WHERE NUMF IN (
SELECT NUMF
FROM RÉCOMPENSE_FILM
UNION
SELECT NUMF
FROM RÉCOMPENSE_ACTEUR )
Requêtes difficilesRequête!25!:
Forme imbriquée SQL-89 :
SELECT NOM, VILLE
FROM CINÉMA C
WHERE NOT EXISTS (
SELECT *
FROM PASSE P
WHERE P.NUMC = C.NUMC
AND NOT EXISTS (
SELECT *
FROM RÉCOMPENSE_FILM RF
WHERE RF.NUMF = P.NUMF )
AND NOT EXISTS (
SELECT *
FROM RÉCOMPENSE_ACTEUR RA
WHERE RA.NUMF = P.NUMF ) )
En SQL-2 par contre, on peut utiliser une union dans une sous-requête, ce qui simplifie son expression.
Forme imbriquée SQL-92 – prédicat NOT EXISTS :
SELECT NOM, VILLE
FROM CINÉMA C
WHERE NOT EXISTS (
SELECT *
FROM PASSE P
WHERE P.NUMC = C.NUMC
AND NOT EXISTS (
SELECT *
FROM (
SELECT NUMF
FROM RÉCOMPENSE_FILM
UNION
SELECT NUMF
FROM RÉCOMPENSE_ACTEUR ) AS R
WHERE R.NUMF = P.NUMF ) )
Forme imbriquée SQL-92 – prédicat NOT IN :
SELECT NOM, VILLE
FROM CINÉMA
WHERE NUMC NOT IN (
SELECT NUMC
FROM PASSE
WHERE NUMF NOT IN (
SELECT R.NUMF
FROM (
SELECT NUMF
FROM RÉCOMPENSE_FILM
UNION
SELECT NUMF
FROM RÉCOMPENSE_ACTEUR ) AS R ) ) )
Requête!26!:
Forme imbriquée SQL-92 :
SELECT TITRE, ANNÉE
FROM FILM
WHERE NUMF IN (
SELECT R.NUMF
FROM (
SELECT NUMF
FROM RÉCOMPENSE_FILM
UNION
SELECT NUMF
FROM RÉCOMPENSE_ACTEUR ) AS R
GROUP BY R.NUMF
HAVING COUNT (*) >= 3 )
Requête!27!:
SELECT PRÉNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT NUMA
FROM RÉCOMPENSE_ACTEUR
GROUP BY NUMA
HAVING COUNT (*) > (
SELECT MAX (
SELECT COUNT (*)
FROM RÉCOMPENSE_ACTEUR
WHERE NUMA IN (
SELECT NUMA
FROM DISTRIBUTION
WHERE NUMF IN (
SELECT NUMF
FROM FILM
WHERE TITRE = ‘Casablanca’ ) )
GROUP BY NUMA ) ) )