2

同じ著者によるすべての本を一覧表示するクエリを作成しようとしています。ほとんどのリストには 1 人の著者による本が 1 冊しかありませんが、db に複数の本がリストされている著者には、その著者の本を表示してもらいたいと考えています。

私は2つのテーブルを持っています:

  • -AuthorID, BkTitleなど
  • 著者-AuthorID, AuthFName, AuthLName

結果を並べ替えAuthLName、レポートを db 内の同じ本で構成したいと考えていauthoridます。

希望する結果の例:

 AUTHORID BKTITLE           AUTHFNAME     AUTHLNAME
--------- ----------------- ------------  -----------
    504   KNIGHT FREEDOM     Chris        Feehan
    504   KNIGHT SHOWDOWN    Chris        Feehan

現在、次のコードがあります。

select AUTHORID, BKTITLE
from BOOK 
where AUTHORID in
    (select AUTHORID from
       (select AUTHORID, 
               count(*) as BOOK_COUNT
        from BOOK
        group by AUTHORid
        order by AUTHORid )
     where BOOK_COUNT >= 2);

これは次を与えます:

  AUTHORID BKTITLE
---------- --------------------
       504 KNIGHT FREEDOM
       504 KNIGHT SHOWDOWN

Author テーブルから情報を取得し、これに追加する方法を見つける必要があります。

4

3 に答える 3

2

これは次のことを行う必要があります。

SELECT b.AUTHORID, b.BKTITLE, a.AUTHFNAME, a.AUTHLNAME
FROM BOOK b
  INNER JOIN AUTHOR a
    ON b.AUTHORID = a.AUTHORID
AND b.AUTHORID IN
(
  SELECT AUTHORID
  FROM BOOK
  GROUP BY AUTHORID
  HAVING COUNT(AUTHORID) > 1
)
ORDER BY a.AUTHLNAME, a.AUTHFNAME
于 2012-04-14T19:39:21.243 に答える
1

これはどうですか - 最初に CTE (Common Table Expression) を使用してデータベース テーブルに複数の本がある著者を特定しBOOK、次にそれらの著者とその本のみを一覧表示するように更新しました。

;WITH AuthorsWithMoreThanOneBook AS
(
    SELECT AUTHORID, BOOK_COUNT = COUNT(*)
    FROM BOOK
    GROUP BY AUTHORID
    HAVING BOOK_COUNT > 1)
)
SELECT
    b.AUTHORID, b.BKTITLE, a.AuthFName, a.AuthLName
FROM
    BOOK b
INNER JOIN
    AUTHOR a ON b.AuthorID = a.AuthorID
INNER JOIN 
    AuthorsWithMoreThanOneBook A2 ON a.AuthorID = A2.AuthorID
ORDER BY
    a.AuthLName, a.AuthFName

更新: OK、あなたは Oracle を使用しています ....わかりません (何年も使用していません) - しかし、元のクエリを次のように拡張することはできません:

select bk.AUTHORID, bk.BKTITLE, a.AUTHORFNAME, a.AUTHORLNAME
from BOOK AS bk
INNER JOIN AUTHOR AS a ON a.AUTHORID = bk.AUTHORID
where bk.AUTHORID in
    (select AUTHORID from
       (select AUTHORID, 
               count(*) as BOOK_COUNT
        from BOOK
        group by AUTHORid
        order by AUTHORid )
     where BOOK_COUNT >= 2);

Oracleがこれらのテーブルエイリアスをサポートしているかどうか/どのようにサポートしているかはわかりません(BOOK AS bk)-しかし、何らかの方法でサポートしていると確信しています....

于 2012-04-14T19:39:49.977 に答える
0

これは、各テーブルに 1 回だけアクセスすることで実行できます。

SELECT * FROM
(
  SELECT AuthorID, BkTitle, AuthFName, AuthLName
        ,COUNT(*) OVER (PARTITION BY AuthorID)
         AS c
  FROM BOOK
  JOIN AUTHOR USING (AuthorID)
)
WHERE c > 1;
于 2012-04-16T06:02:37.343 に答える