我是一名學生,正在研究 SQL 查詢以根據回傳日期列值為 NULL 來生成未歸還的書籍,但是輸出需要我加入 3 個表。得到的結果不正確,我嘗試了很多 GROUP BY 和其他 WHERE 條件的組合。
這是我的問題提示:
撰寫查詢以找出尚未回傳的副本。輸出應顯示書名、借書人姓名、copy_id、借書人電話和借書人電子郵件。此外,還應按借款人姓名排序。(提示:loan_date_returned 為空)
ER圖
我的代碼如下:
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
我從視覺上推斷出貸款表中的 20 個條目中只有 6 個結果是預期的,但是,我似乎收到了重復和結果,其中許多借款人幾乎借了所有錯誤的書籍。
uj5u.com熱心網友回復:
辛苦了,您的查詢已關閉。您對貸款與一本書的關聯沒有任何條件。
此外,您使用舊的 ANSI-SQL 撰寫,而不是使用正確的 JOIN 語法。將 FROM 子句視為定義將在查詢中使用的所有表(及其別名)以及它們如何相關(通常是您的 ID 鍵加入它們)的部分。在借書的情況下,我假設有一些“BookID”借給了實際的書。那是失蹤的。
正如您在撰寫查詢時通過縮進看到的那樣,您可以看到表 1 如何通過緊隨其后的“ON”子句連接到下一個表。在 WhatCondition 上將 tableX 連接到 tableY。由于給定的借出專案與一本書以及借閱者相關聯,因此您可以看到借閱者的縮進處于同一級別,但緊跟其后的是與 IT 相關的連接“ON”條件。我也總是先寫左側表=右側表。我認為這有助于了解從第一個匹配到第二個的欄位。
基于回傳的貸款日期為空的唯一條件,您的 WHERE 子句是可以的。
至于 ORDER BY,如果您嘗試按不在所選列的結果集中的某些列排序,我已經看到引擎會嘮叨您,所以我只是將名稱的 concat() 復制到 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 Copies C
on L.copy_id = C.Copy_id
JOIN book BK
ON C.Book_ID = BK.Book_ID
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/460337.html
