SQL查询需要从两个单独的表中获取信息

问题描述:

我想创建一个查询,它将列出同一作者的所有书籍。大多数列表只有一个作者的一本书,但我希望作者有db中列出的多本书来显示那个作者的书。SQL查询需要从两个单独的表中获取信息

我有两个表:

  • - AuthorID, BkTitle
  • 作者 - AuthorID, AuthFName, AuthLName

我想要的结果由AuthLName进行排序,并包括报告的任何书籍的分贝有相同的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 

我需要找到一种方式来获得信息从作者表中添加它。

这应该这样做:

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的书出现。 – 2012-04-14 20:05:11

+0

@ReneCanter - 答案已更新为仅包含具有作者或多本书籍的图书。 – Oded 2012-04-14 20:09:23

+0

太棒了!非常感谢!!这让我疯狂:-) – 2012-04-14 20:10:02

这个怎么样 - 更新为使用CTE(公共表表达式)先找出哪些作家有一个以上的书在数据库表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); 

不知道是否/如何甲骨文支持这些表的别名(BOOK AS bk) - 但我敢肯定它支持它的一些这样或那样的....

+0

我在想,或许OP意味着将查询限制为拥有多本书的作者?但不知道。 – Oded 2012-04-14 19:41:29

+0

列出所有列,但它也列出所有书籍。我只想列出同一作者的这些书。 一个例子: AUTHORID BKTITLE AUTHFNAME AUTHLNAME 512黑影CAMERON DEAN 587 KNIGHT PRINCE DARYLL DEANLOP 504 KNIGHT SHOWDOWN恭菲恩 504 KNIGHT自由恭菲恩 唯一书应该被列出为504的AUTHORID因为有更多的比db – 2012-04-14 19:56:40

+0

中的一个很抱歉,无法让它格式正确。但作者ID 504在数据库中有两本书。所以我希望这两个只列出,因为所有其他作者只有一本书在db – 2012-04-14 20:00:40

你可以只用一个做到这一点访问每个表格:

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