我需要查找所有未从类别名称中包含字母“非”的类别借出书籍的客户的姓名和ID。我有这段代码:
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%'
)
这段代码有什么问题?我一直在寻找为此编写正确代码的日子,我不确定它是否可能(尽管我很确定我会立即被证明是错误的)。我绝对坚持这一点。我的代码总是显示每个借出的书,其中包含“非”类别的借书。
编辑:这里添加了整个数据库结构:
提前致谢!
答案 0 :(得分:1)
你可能错过了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%'
)
答案 1 :(得分:1)
您需要以某种方式加入子查询中的LEND和CATEGORY表。
在不知道你的方案的情况下,我无法确切地说出来,但问题是:
SELECT * FROM LEND WHERE CLIENT.client_id = LEND.client_id AND CATEGORY.category like '%non%'
您只是从LEND中选择,但您的条件引用了" CATEGORY.category中的CATEGORY类似于'%non%'"
编辑: 根据你添加的描述,我想它应该是这样的:
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%'
)
根据数据库的不同,可能会略有不同。有些数据库区分大小写。