-- Les noms des adherents pouvant empruntes plus de 3 livres simultanement
SELECT Id, Nom
FROM   Bibliotheque.Adherents
WHERE  Bibliotheque.Adherents.NbEmpruntsAutorises > 3;

-- Les nom et prenoms des lecteurs de '2-7117-4838-3'
SELECT   Adherent, Nom, Prenom
FROM     Bibliotheque.Adherents, Bibliotheque.Livres, Bibliotheque.Emprunts
WHERE    Adherents.Id = Emprunts.Adherent
  AND    Livres.Id = Emprunts.Livre
  AND    ISBN = '2-7117-4838-3';
-- Toutes les couples (oeuvres lues, adherent)
CREATE VIEW OeuvresLues AS
  SELECT   ISBN, Adherent
  FROM     Bibliotheque.Livres, Bibliotheque.Emprunts
  WHERE    Livres.Id = Emprunts.Livre;
-- Les adherents en retard pour retourner un emprunt.
SELECT   Id, Nom, Prenom
FROM     Bibliotheque.Adherents, Bibliotheque.Emprunts
WHERE    Adherents.Id = Emprunts.Adherent
  AND    current_date < DateRetour
  AND    current_date > DateEmprunt + integer '30';
-- Les adherents ayant le droit d'emprunter a la date du jour
SELECT   Id, Nom, Prenom
FROM     Bibliotheque.Adherents
WHERE    NbEmpruntsAutorises > 0
  EXCEPT
SELECT   Id, Nom, Prenom
FROM     Bibliotheque.Adherents, Bibliotheque.Emprunts
WHERE    Adherents.Id = Emprunts.Adherent
  AND    current_date < DateRetour
GROUP BY Id, Nom, Prenom, NbEmpruntsAutorises
HAVING   (NbEmpruntsAutorises <= count(*));
-- Les couples (Adherent, ISBN) des oeuvres lus par les lecteurs de '2-7117-4838-3'
SELECT   Adherent, ISBN
FROM     Bibliotheque.Livres, Bibliotheque.Emprunts
WHERE    Livres.Id = Emprunts.Livre
  AND    Adherent IN (
           SELECT   Adherent
           FROM     Bibliotheque.Adherents, Bibliotheque.Livres, Bibliotheque.Emprunts
           WHERE    Adherents.Id = Emprunts.Adherent
             AND    Livres.Id = Emprunts.Livre
             AND    ISBN = '2-7117-4838-3');
-- Les oeuvres lues par tous les adherents
-- Division predicative
SELECT DISTINCT ISBN
FROM   Bibliotheque.OeuvresLues
WHERE  NOT EXISTS
       (SELECT *
         FROM   Bibliotheque.Adherents
         WHERE  NOT EXISTS
                (SELECT Adherent
                 FROM   Bibliotheque.OeuvresLues AS R11
                 WHERE  R11.ISBN = OeuvresLues.ISBN
                 AND    R11.Adherent = Adherents.Id));
-- Division algebrique
SELECT DISTINCT ISBN
FROM   Bibliotheque.OeuvresLues
EXCEPT
SELECT  ISBN
FROM    (SELECT *
         FROM   (SELECT DISTINCT ISBN
                 FROM   Bibliotheque.OeuvresLues) AS PiR1,
                (SELECT Id 
                 AS Adherent FROM Bibliotheque.Adherents) AS TMP
         EXCEPT
         SELECT *
         FROM   Bibliotheque.OeuvresLues) AS NonEntierR1;
