2012-04-14 13 views
2

同じ著者がすべての書籍をリストするクエリを作成しようとしています。ほとんどのリストには1人の作者しかいないが、dbにリストされた複数の書籍がある著者に、その著者のためにそれらの本を表示したい。2つのテーブルから情報を取得するためにSQLクエリが必要

私は2つのテーブルがあります。

  • ブック - AuthorID, BkTitleなど
  • 著者からAuthorID, AuthFName, AuthLName

私は結果がAuthLNameとから構成するレポートでソートしたいの同じauthoridのdb内の書籍のうち、

例の結果が欲しかった:

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   AUTHFNAME  AUTHLNAME 
--------- ----------------- ------------ ----------- 
    504 KNIGHT FREEDOM  Chris  Feehan 
    504 KNIGHT SHOWDOWN Chris  Feehan 

現在、私は次のコードを持っている

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

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

答えて

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 
+0

これはdbのすべての書籍のリストです。私は1つ以上の本に記載されているAuthorIDを持つ本が欲しいだけです。 –

+0

@ReneCanter - 回答が更新され、著者または複数の本がある書籍のみが含まれます。 – Oded

+0

恐ろしい!!!本当にありがとう!!これは私をnutz :-)を駆動していた –

1

方法 - データベーステーブルBOOKに複数の本を持っている著者把握する最初のCTE(共通テーブル式)を使用するように更新した後、リストのみをこれらの著者と彼らの本:

;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)をサポートしている場合は/どのように確認してください - しかし、私はそれにいくつかの方法または別のをサポートしていますかなり確信している....

+0

私はおそらくOPは複数の本を持つ著者にクエリを制約することを意味していると思う?確かに。 – Oded

+0

すべての列をリストしますが、すべての書籍もリストします。私は同じ著者によってそれらの本をリストしたいだけです。 例: AUTHORID BKTITLE AUTHFNAME AUTHLNAME 512暗い影CAMERONディーン 587 KNIGHT PRINCE DARYLL DEANLOP 504 KNIGHT SHOWDOWNクリスティン・フィーハン のみ書籍がよりがあるので504のAuthoridがリストされるべきであるクリスティン・フィーハン504 KNIGHT FREEDOM dbの1つ以上 –

+0

申し訳ありませんが、それを正しくフォーマットすることはできません。しかし、著者ID504は、データベース内に2冊の書籍を有する。他のすべての著者には1冊の本が1冊しかないので、その2冊をリストアップします。 –

0

あなたは一つだけでこれを行うことができます各テーブルへのアクセス:

SELECT * FROM 
(
    SELECT AuthorID, BkTitle, AuthFName, AuthLName 
     ,COUNT(*) OVER (PARTITION BY AuthorID) 
     AS c 
    FROM BOOK 
    JOIN AUTHOR USING (AuthorID) 
) 
WHERE c > 1; 
関連する問題