GOOGLE ADS

lunes, 25 de abril de 2022

problemas de combinación triple para producir los resultados deseados

Soy un estudiante que trabaja en una consulta SQL para producir libros no devueltos en función de que el valor de la columna de fecha de devolución sea NULL, sin embargo, el resultado requiere que me una a 3 tablas. El resultado obtenido es incorrecto, y he probado muchas combinaciones de condiciones GROUP BY y WHERE adicionales.

Aquí está mi mensaje de pregunta:

Escribe una consulta para saber qué ejemplares aún no han sido devueltos. La salida debe mostrar el título del libro, el nombre del prestatario, el copy_id, el teléfono del prestatario y el correo electrónico del prestatario. Además, también debe ordenarse por el nombre del prestatario. (Sugerencia: préstamo_fecha_devuelto es nulo)

My code is as follows:

SELECT BK.book_title AS "Title", CONCAT(BRW.borrower_fname, ' ',BRW.borrower_lname) AS "Name", L.copy_id AS "Copy ID", BRW.borrower_phone AS "Phone", BRW.borrower_email AS "Email"
FROM loan AS L, book AS BK, borrower AS BRW
WHERE BRW.borrower_id = L.borrower_id AND L.loan_date_returned IS NULL
ORDER BY BRW.borrower_fname, BRW.borrower_lname

Deduzco visualmente que solo se esperan 6 resultados de las 20 entradas en la tabla de préstamo, sin embargo, parece que estoy recibiendo repeticiones y resultados donde muchos prestatarios han tomado prestados casi todos los libros, lo cual es erróneo.


Solución del problema

Buen esfuerzo, su consulta fue CERRADA. No tenía ninguna condición sobre cómo se asociaba el préstamo con un libro.

Además, estaba escribiendo en ANSI-SQL antiguo en lugar de usar la sintaxis JOIN adecuada. Piense en la cláusula FROM como la sección sobre la definición de todas las tablas (y sus alias) que se utilizarán en la consulta Y cómo se relacionan (por lo general, sus claves de identificación se unen a ellas). En el caso de préstamo de libro, asumo que hay algún "BookID" que se presta al libro real. Faltaba eso.

Como puede ver por las sangrías mientras escribo mi consulta, puede ver cómo la tabla 1 se une a la siguiente tabla por su cláusula "ON" inmediatamente posterior. Únase a tableX con tableY en WhatCondition. Dado que un elemento prestado dado está asociado tanto con un libro como con quién lo tomó prestado, puede ver que la sangría del prestatario está en el mismo nivel, pero tiene la condición de unión "ON" relacionada con TI inmediatamente después. También siempre escribo primero la tabla del lado izquierdo = tabla del lado derecho. Creo que ayuda saber cómo coincide el campo del primero con el segundo.

Su cláusula WHERE está bien basada en la única condición de que la fecha de préstamo devuelta sea nula.

En cuanto a ORDER BY, he visto momentos en los que un motor lo molestará si intenta ordenar por alguna columna que no está en el conjunto de resultados de columnas seleccionadas, así que solo copié el concat() para el nombre en la cláusula order by.

SELECT 
BK.book_title Title,
CONCAT(BRW.borrower_fname, ' ',BRW.borrower_lname) Name,
L.copy_id AS "Copy ID",
BRW.borrower_phone Phone,
BRW.borrower_email Email
FROM
loan L
JOIN book BK
ON L.BookID = BK.BookID
JOIN borrower BRW
ON L.borrower_id = BRW.borrower_id
WHERE
L.loan_date_returned IS NULL
ORDER BY
CONCAT(BRW.borrower_fname, ' ',BRW.borrower_lname)

No hay comentarios:

Publicar un comentario

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...