关于NOT EXISTS的问题

时间:2015-10-11 09:52:18

标签: sql-server tsql exists

我需要查找所有未从类别名称中包含字母“非”的类别借出书籍的客户的姓名和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%'
)

这段代码有什么问题?我一直在寻找为此编写正确代码的日子,我不确定它是否可能(尽管我很确定我会立即被证明是错误的)。我绝对坚持这一点。我的代码总是显示每个借出的书,其中包含“非”类别的借书。

编辑:这里添加了整个数据库结构:

  • 作者(由AuthorID和AuthorName组成)
  • 图书(BookID,AuthorID,年份,标题,CategoryID,PublisherID)
  • 类别(CategoryID,CategoryName)
  • 客户端(ClientID,ClientName,Place)
  • Publisher(PublisherID,PublisherName)
  • Lend(Number,BookID,Date,ClientID)

提前致谢!

2 个答案:

答案 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%'
)

根据数据库的不同,可能会略有不同。有些数据库区分大小写。