PUERTA | Sudo GATE 2020 Mock I (27 de diciembre de 2019) | Pregunta 61

Considere el siguiente esquema de base de datos:

BOOK(Book_id, Title, Publisher_name)
BOOK_AUTHORS(Book_id, Author_name)
PUBLISHER(Name, Address, Phone)
BOOK_COPIES(Book_id, Branch_id, No_of_copies)
BOOK_LOANS(Book_id, Branch_id, Card_no, Date_out, Due_date)
LIBRARY_BRANCH(Branch_id, Branch_name, Address)
BORROWER(Card_no, Name, Address, Phone) 

Tenga en cuenta que BOOK_COPIES solo contiene entradas donde No_of_copies es al menos 1: si una sucursal no contiene ninguna copia de algún libro, no hay ninguna entrada en BOOK_COPIES (no una entrada con 0 copias).

Los atributos clave están subrayados. Las restricciones de clave externa son las siguientes:

  • Publisher_name en BOOK se refiere al nombre en PUBLISHER.
  • Los atributos Book_id en BOOK_AUTHORS, BOOK_COPIES y BOOK_LOANS hacen referencia al Book_id en BOOK.
  • Los atributos Branch_id en BOOK_COPIES y BOOK_LOANS ambos se refieren a Branch_id en LIBRARY_BRANCH.
  • El Card_no en BOOK_LOANS se refiere al Card_no en BORROWER.

Queremos encontrar los títulos de todos los libros escritos por los autores que han escrito la mayor cantidad de libros. ¿Cuál de las siguientes consultas no es correcta?
(Suponga que puede haber un empate).
(A)

SELECT DISTINCT Title
    FROM BOOK NATURAL JOIN BOOK_AUTHORS
    WHERE Author_name IN ( SELECT Author_name
                           FROM BOOK NATURAL JOIN BOOK_AUTHORS
                           GROUP BY Author_name
                           HAVING COUNT(*) >= ALL ( SELECT COUNT(*)
                                                    FROM BOOK NATURAL JOIN BOOK_AUTHORS
                                                    GROUP BY Author_name ) )

(B)

SELECT DISTINCT Title
    FROM BOOK NATURAL JOIN BOOK_AUTHORS
    WHERE Author_name = ANY ( SELECT Author_name
                              FROM BOOK NATURAL JOIN BOOK_AUTHORS
                              GROUP BY Author_name
                              HAVING COUNT(*) >= ALL ( SELECT COUNT(*)
                                                       FROM BOOK NATURAL JOIN BOOK_AUTHORS
                                                       GROUP BY Author_name ) )

(C)

SELECT DISTINCT Title
    FROM BOOK NATURAL JOIN BOOK_AUTHORS A
    WHERE ( SELECT COUNT(*)
            FROM BOOK_AUTHORS A2
            WHERE A.Author_name=A2.Author_name ) >= ALL ( SELECT COUNT(*)
                                                          FROM BOOK NATURAL JOIN BOOK_AUTHORS
                                                          GROUP BY Author_name )

(D)

SELECT DISTINCT Title
    FROM BOOK NATURAL JOIN BOOK_AUTHORS
    WHERE Author_name = ( SELECT Author_name
                           FROM BOOK NATURAL JOIN BOOK_AUTHORS
                           GROUP BY Author_name
                           HAVING COUNT(*) >= ALL ( SELECT COUNT(*)
                                                    FROM BOOK NATURAL JOIN BOOK_AUTHORS
                                                    GROUP BY Author_name ) )

Respuesta: (D)
Explicación: Tenga en cuenta que lo siguiente solo funciona si no hay un empate, es decir, hay un solo autor con la mayor cantidad de libros:

SELECT DISTINCT Title
    FROM BOOK NATURAL JOIN BOOK_AUTHORS
    WHERE Author_name = ( SELECT Author_name
                           FROM BOOK NATURAL JOIN BOOK_AUTHORS
                           GROUP BY Author_name
                           HAVING COUNT(*) >= ALL ( SELECT COUNT(*)
                                                    FROM BOOK NATURAL JOIN BOOK_AUTHORS
                                                    GROUP BY Author_name ) )

La opción (D) es correcta.
Cuestionario de esta pregunta

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *