选择id不等于x的记录



我有这些表

object BooksAuthors : Table(name = "books_authors") {
val book = reference("book_id", Books, onDelete = ReferenceOption.CASCADE)
val author = reference("author_id", Authors, onDelete = ReferenceOption.CASCADE)
}
object Books : IntIdTable() {
val title = varchar("title", 250)
val isbn = varchar("isbn", 13)
}
object Authors : IntIdTable() {
val email = varchar("email", 100).uniqueIndex()
}

我想写一个查询,返回所有没有特定作者的书,所以我写了这个

suspend fun getBooksWithoutAuthorId(authorId: Int): List<BookDTO> = DbFactory.dbQuery {
val query = BooksAuthors.innerJoin(Books).select { BooksAuthors.author neq authorId }
Book.wrapRows(query).map { it.toDTO() }
}

但是查询返回的是有作者的书。我做错了什么?

正如Sebastian Redl所提到的,可能有多个作者的书,而您的查询不包括这种情况。

正确的公开查询应为:

val query = Books.select {
Books.id notInSubQuery 
BooksAuthors.slice(BooksAuthors.book).select { BooksAuthors.author eq authorId }
}

看起来有一个n:m映射,其中一本书可以有多个作者。

您的查询在编写时会查找您所选作者以外的其他作者所编写的任何书籍。

这意味着,如果作者爱丽丝和鲍勃一起写了一本书,而你想找书"而不是Bob";,你仍然可以找到这本书,因为爱丽丝参加了。

所需的查询不能表示为简单联接;您需要嵌套查询。

类似于这个SQL:的东西

SELECT * from books b WHERE ? NOT IN (
SELECT ab.author_id FROM authors_books ab WHERE ab.book_id = b.id);

尽管我恐怕不知道如何在《暴露》中表达这一点。

https://www.db-fiddle.com/f/7BsVUW95g6L4rXDBCoaXK3/0

最新更新