2

これは私のテーブル構造です

 CREATE TABLE branch_book_list (
   branch_name CHAR(10),
   book_ISBN CHAR (13),
   book_name CHAR(40),
   PRIMARY KEY (branch_name, book_ISBN)
   )

テーブルに次のデータ行があります。

branch_name book_ISBN     book_name                                
----------- ------------- ---------------------------------------- 
Branch A    1-56592-756-7 Transact-SQL Cookbook                   
Branch A    1-56592-401-0 Transact-SQL Programming                
Branch A    1-56592-401-0 Transact-SQL Programming                
Branch B    1-56592-756-7 Transact-SQL Cookbook                   
Branch B    1-56592-756-7 Transact-SQL Cookbook                   
Branch B    1-56592-401-0 Transact-SQL Programming

このクエリを実行すると:

SELECT bbl1.*, COUNT(*) DupeCount
FROM branch_book_list bbl1
WHERE bbl1.branch_name = 'Branch A'
GROUP BY bbl1.branch_name, bbl1.book_ISBN, bbl1.book_name
HAVING NOT EXISTS (
      SELECT bbl2.*, COUNT(*)
      FROM branch_book_list bbl2
      WHERE branch_name = 'Branch B'
      GROUP BY bbl2.branch_name, bbl2.book_ISBN, bbl2.book_name
      HAVING bbl1.book_ISBN = bbl2.book_ISBN
         AND bbl1.book_name = bbl2.book_name
         AND COUNT(*) = COUNT(ALL bbl1.book_ISBN))

出力は

branch_name book_ISBN     book_name                                DupeCount   
----------- ------------- ---------------------------------------- ----------- 
Branch A    1-56592-401-0 Transact-SQL Programming                 2
Branch A    1-56592-756-7 Transact-SQL Cookbook                    1

クエリの上部のみを実行すると

SELECT bbl1.*, COUNT(*) DupeCount
FROM branch_book_list bbl1
WHERE bbl1.branch_name = 'Branch A'
GROUP BY bbl1.branch_name, bbl1.book_ISBN, bbl1.book_name

私の出力は

branch_name book_ISBN   book_name                   DupeCount
Branch A    1-56592-401-0   Transact-SQL Programming    2
Branch A    1-56592-756-7   Transact-SQL Cookbook       1

しかし、完全なクエリが実行されたときに、この出力を取得するにはどうすればよいですか?

branch_name book_ISBN     book_name                                DupeCount   
----------- ------------- ---------------------------------------- ----------- 
Branch A    1-56592-401-0 Transact-SQL Programming                 2
Branch A    1-56592-756-7 Transact-SQL Cookbook                    1

誰かが私が出力を超えることができる方法を教えてもらえますか?

4

2 に答える 2

0

あなたの混乱は何ですか?フィルターWHERE bbl1.branch_name = 'Branch A' は、3 つのすべてのクエリを分岐 A レコードのみに制限します...したがって、Having Not exists は冗長です...
having 句によって検査されるレコードは、分岐 B のデータを持つことはできません。クエリはそれらを排除します。

于 2012-09-22T16:53:46.383 に答える
0

NOT EXISTS サブクエリは、同じ ISBN、同じ名前、同じ重複数を持つ別のブランチの行を検索します。他の分岐でこれらの条件に一致するものがない場合、クエリは出力に行を含めます。

ここで、2 つのブランチには同じアイテムがありますが、重複の数が異なります。そのため、ブランチ A の両方のアイテムが返されます。つまり、これらはHAVING 句によって除外されません。しかし、たとえば 2 つの(Branch B, 1-56592-756-7)項目のいずれかを削除してみると、完全なクエリと縮小版の違いがわかります。

于 2012-09-22T22:07:16.027 に答える