我需要找到所有没有从类别中借书的客户的名称和id,类别名称中有字母'non'。我有这样的代码:
SELECT CLIENT.clientname, CLIENT.client_id
FROM CLIENT
WHERE NOT EXISTS (
SELECT *
FROM LEND
WHERE CLIENT.client_id = LEND.client_id
AND CATEGORY.category like '%non%'
)
这段代码有什么问题?我已经搜索了好几天来编写正确的代码,我不确定这是否可能(尽管我很确定我马上就会被证明是错误的)。我完全被这个困住了。我的代码总是显示每个借出的书与借出的书有类别"非"在它。
编辑:整个数据库结构已经添加到这里:
- 作者(包括AuthorID和AuthorName)
- 图书(bookkid, AuthorID, Year, Title, CategoryID, PublisherID)
- 类别(CategoryID, CategoryName)
- 客户端(ClientID, ClientName, Place)
- Publisher (PublisherID, PublisherName)
- 出借(编号,图书编号,日期,客户编号)
提前感谢!
您可能错过了与CATEGORY
表的JOIN。我重写了que查询以使用NOT IN
SELECT CLIENT.clientname, CLIENT.client_id
FROM CLIENT
WHERE CLIENT.client_id NOT IN
(
SELECT DISTINCT LEND.client_id
FROM LEND
JOIN CATEGORY
ON LEND.category_id = CATEGORY.category_id
WHERE CATEGORY.category like '%non%'
)
您需要在子查询中以某种方式连接LEND和CATEGORY表。
在不知道你的方案的情况下,我不能确切地说出来,但问题是:
SELECT * FROM LEND WHERE CLIENT.client_id = LEND.client_id AND CATEGORY.category like '%non%'
您只从LEND中选择,但您的条件引用了"CATEGORY"中的CATEGORY。"%非%"之类的类别
编辑:根据你添加的描述,我猜应该是这样的:
SELECT CLIENT.clientname, CLIENT.client_id
FROM CLIENT
WHERE NOT EXISTS (
SELECT *
FROM LEND
INNER JOIN BOOKS ON LEND.BookID = BOOKS.BookID
INNER JOIN CATEGORY ON CATEGORY.CategoryID = BOOKS.CategoryID
WHERE CLIENT.client_id = LEND.client_id
AND CATEGORY.CategoryName like '%non%'
)
可能因数据库的不同而有所不同。有些数据库区分大小写。