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
这个怎么样 - 更新为使用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
) - 但我敢肯定它支持它的一些这样或那样的....
我在想,或许OP意味着将查询限制为拥有多本书的作者?但不知道。 – Oded 2012-04-14 19:41:29
列出所有列,但它也列出所有书籍。我只想列出同一作者的这些书。 一个例子: 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
中的一个很抱歉,无法让它格式正确。但作者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;
这还列出了所有db中的图书。我只希望那些有超过1本书上列出的AuthorID的书出现。 – 2012-04-14 20:05:11
@ReneCanter - 答案已更新为仅包含具有作者或多本书籍的图书。 – Oded 2012-04-14 20:09:23
太棒了!非常感谢!!这让我疯狂:-) – 2012-04-14 20:10:02