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:是的,这正是我要问的!我需要给定作者的第一本付费书。谢谢