1

私はこれらのテーブルを持っています

BooksCatalog
[BookCatalogID],[BooksCatalogBookID],[ReceivedFrom],[BillNo],[billdate]

Books
[BookID],[BookTitle],[ISBN],[ISBN13],[BookAuthorID],[BookPublisherID],[YearPublished],[NumberOfPages],[Volume],[edition],[Price]

Authors
[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 つのサブクエリを使用しているため、最適化されていないと感じており、同等の内部結合で使用するとパフォーマンスが向上する可能性があります。では、これに相当する内部結合は何ですか? 私がやっていることは、ライブラリに追加された特定の著者の最初のものを見つけることです。

4

2 に答える 2

2

エイリアス、スキーマ プレフィックスの使用、要素の命名 (BookId や AuthorId など) をスキーマ全体で同じにすることについては、多くのことが言えます。本当に BookAuthorId または BooksCatalogBookID と呼ぶ必要がありますか?

とにかく、この方法でクエリを少しきれいに書き直すことができますが、@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;

ただし、ここでは非常に独特な結合基準に依存しているようです。カタログにあるすべての本のうち、請求日が最も早い本が、あなたが特定した 1 人の著者によって書かれた可能性はどのくらいですか? あなたのロジックは、指定された著者から最初に請求された本を取得することを意図していた可能性はありますか? もしそうなら、おそらくこれはより理にかなっています:

;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; 
于 2012-09-26T03:26:29.757 に答える
0

1 つのサブクエリを内部結合に置き換えることができます。

            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;
于 2012-09-26T03:16:27.760 に答える