2012-04-14 6 views
2

Ich versuche, eine Abfrage zu erstellen, die alle Bücher desselben Autors auflistet. Der größte Teil der Liste enthält nur ein Buch von einem Autor, aber ich möchte, dass der Autor, der mehrere in db aufgelistete Bücher hat, dieses Buch für diesen Autor anzeigt.SQL-Abfrage erforderlich, um Informationen aus zwei separaten Tabellen zu erhalten

Ich habe zwei Tabellen:

  • Buch - AuthorID, BkTitle, etc
  • Autor - AuthorID, AuthFName, AuthLName

ich das Ergebnis will durch AuthLName und der Bericht sortiert werden bestehen von irgendwelchen Büchern in db, die dasselbe authorid haben.

Beispielergebnis wollte:

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

Derzeit habe ich den folgenden Code:

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); 

die gibt:

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

Ich muss einen Weg finden, um die Informationen zu erhalten aus der Author-Tabelle und fügen Sie es in diesem ein.

Antwort

2

Dies sollte tun:

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

Dies ist auch eine Liste aller Bücher in db. Ich möchte nur die Bücher, die die AuthorID auf mehr als 1 Buch aufgeführt haben, erscheinen. –

+0

@ReneCanter - Antwort aktualisiert, um nur Bücher einzuschließen, die Autoren oder mehr als ein Buch haben. – Oded

+0

Super !!! Vielen Dank!! Das hat mich nuz getrieben :-) –

1

Wie über dieses - zunächst einen CTE (Common Table Expression) verwenden aktualisiert, um herauszufinden, welche Autoren in der Datenbanktabelle BOOK, mehr als ein Buch und dann nur die Auflistung diese Autoren und ihre Bücher:

;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 

Update: OK, Sie Oracle verwenden .... nicht sicher (habe es nicht in Alter verwendet) - aber können Sie nicht nur Ihre ursprüngliche Abfrage erweitern etwas wie das:

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); 

Nicht sicher, ob/wie Oracle, diese Tabellen-Aliases (BOOK AS bk) unterstützt - aber ich bin mir ziemlich sicher, dass es ihm eine oder andere Weise jedoch zwingend nötig ....

+0

Ich denke vielleicht das OP bedeutet, die Abfrage auf Autoren einzuschränken, die mehr als ein Buch haben? Nicht sicher, obwohl. – Oded

+0

Dies listet alle Spalten auf, aber es listet auch alle Bücher auf. Ich möchte nur diese Bücher vom selben Autor auflisten. Ein Beispiel: authorid BKTITLE AUTHFNAME AUTHLNAME 512 DARK SHADOW CAMERON DEAN 587 KNIGHT PRINCE Daryll DEANLOP 504 KNIGHT SHOW-DOWN CHRISTINE FEEHAN 504 KNIGHT FREIHEIT CHRISTINE FEEHAN Die einzigen Bücher die authorid von 504 aufgeführt werden sollte, ist, weil es mehr ist als eine in der db –

+0

Sorry, kann es nicht richtig formatieren. Aber Autor-ID 504 hat zwei Bücher in der Datenbank. also möchte ich diese zwei nur aufgelistet, weil alle anderen Autoren nur ein Buch in db –

0

Sie diese mit nur tun können, Zugriff auf jede Tabelle:

SELECT * FROM 
(
    SELECT AuthorID, BkTitle, AuthFName, AuthLName 
     ,COUNT(*) OVER (PARTITION BY AuthorID) 
     AS c 
    FROM BOOK 
    JOIN AUTHOR USING (AuthorID) 
) 
WHERE c > 1; 
Verwandte Themen