Sql server 此子查询的内部联接等价物?
我有这些桌子Sql server 此子查询的内部联接等价物?,sql-server,join,subquery,Sql Server,Join,Subquery,我有这些桌子 图书目录 [BookCatalogID]、[BookCatalogBookId]、[ReceivedFrom]、[BillNo]、[billdate] 书籍 [BookID]、[BookTitle]、[ISBN]、[ISBN13]、[BookAuthorID]、[BookPublisherID]、[YearPublished]、[NumberOfPages]、[Volume]、[edition]、[Price] 作者 [AuthorID]、[AuthorName]、[AuthorC
图书目录
[BookCatalogID]、[BookCatalogBookId]、[ReceivedFrom]、[BillNo]、[billdate]
书籍
[BookID]、[BookTitle]、[ISBN]、[ISBN13]、[BookAuthorID]、[BookPublisherID]、[YearPublished]、[NumberOfPages]、[Volume]、[edition]、[Price]
作者
[AuthorID]、[AuthorName]、[AuthorCityID]、[AuthorStateID]、[PhoneNumber]、[Email]、[Website]
我正在运行这个查询
SELECT Books.BookTitle FROM Books
INNER JOIN Authors ON Authors.AuthorId=Books.BookAuthorID
WHERE Books.BookID IN
(SELECT BooksCatalog.BooksCatalogBookID FROM BooksCatalog
WHERE BooksCatalog.billdate = (SELECT MIN(BooksCatalog.billdate) FROM BooksCatalog))
AND
AUTHORS.AuthorName = @AuthorName;
由于它使用2个子查询,我感觉它没有经过优化,如果与等效的内部连接一起使用,它的性能会更好。那么,这个的等效内连接是什么?我要做的是查找添加到库中的给定作者的第一个。您可以用内部联接替换一个子查询
SELECT Books.BookTitle
FROM Books
INNER JOIN Authors
ON Authors.AuthorId = Books.BookAuthorID
INNER JOIN BooksCatalog
ON BooksCatalog.BooksCatalogBookID = Books.BookID
AND BooksCatalog.billdate = (SELECT MIN(BooksCatalog.billdate) FROM BooksCatalog) WHERE BooksCatalogBookID = Books.BookID)
WHERE Authors.AuthorName = @AuthorName;
在整个模式中使用别名、模式前缀和为元素(如BookId或AuthorId)命名相同的东西有很多值得一提的地方。它真的需要称为BookAuthorId或BookCatalogBookID吗 无论如何,您的查询可以通过这种方式重新编写得更整洁一些,但正如@billy所建议的,它可能不会真正受益于一个完全不同的计划:
SELECT b.BookTitle
FROM dbo.Books AS b
INNER JOIN Authors AS a
ON a.AuthorId = b.BookAuthorID
INNER JOIN
(
SELECT BookId = MIN(BooksCatalogBookID)
FROM dbo.BooksCatalog
) AS bc
ON bc.BookId = b.BookId
WHERE a.AuthorName = @AuthorName;
似乎您依赖于一个非常特殊的连接条件。在目录中所有的书中,账单日期最早的一本碰巧也是由你确定的一位作者写的,这种可能性有多大?你的逻辑是否真的应该是从指定的作者那里得到第一本收费的书?如果是这样,那么这可能更有意义:
;WITH x(BookTitle, rn) AS
(
SELECT b.BookTitle, ROW_NUMBER() OVER (ORDER BY bc.billdate)
FROM dbo.BooksCatalog AS bc
INNER JOIN b.Books AS b
ON b.BookId = bc.BooksCatalogBookID
INNER JOIN dbo.Authors AS a
ON b.BookAuthorID = a.AuthorID
WHERE a.AuthorName = @AuthorName
)
SELECT BookTitle FROM x WHERE rn = 1;
现代RDBMS通常会优化查询,所以我不会担心…@AaronBertand:是的,这正是我要问的!我需要给定作者的第一本付费书。谢谢