Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询需要从两个单独的表中获取信息_Sql_Oracle_Join_Count - Fatal编程技术网

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

SQL查询需要从两个单独的表中获取信息,sql,oracle,join,count,Sql,Oracle,Join,Count,我正在尝试创建一个查询,该查询将列出同一作者的所有书籍。大多数列表中只有一位作者的一本书,但我希望在db中列出多本书的作者为该作者显示这些书 我有两张桌子: 书籍-作者、书名等 作者-作者、作者姓名、作者姓名 我希望结果按AuthLName排序,报告由数据库中具有相同authorid的任何书籍组成 需要的示例结果: AUTHORID BKTITLE AUTHFNAME AUTHLNAME --------- ----------------- ---------

我正在尝试创建一个查询,该查询将列出同一作者的所有书籍。大多数列表中只有一位作者的一本书,但我希望在db中列出多本书的作者为该作者显示这些书

我有两张桌子:

  • 书籍-
    作者、书名
  • 作者-
    作者、作者姓名、作者姓名
我希望结果按
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
我需要找到一种从Author表中获取信息的方法,并将其添加到此中。

这应该可以:

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
更新:好的,您正在使用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
)-但我很确定它确实以某种方式支持这些别名…

您只需对每个表进行一次访问即可:

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

我想也许OP的意思是将查询限制在拥有多本书的作者身上?但不确定。它列出了所有列,但也列出了所有书籍。我只想列出同一作者的那些书。举个例子:AUTHORID BKTITLE AUTHFNAME AUTHLNAME 512暗影卡梅隆DEAN 587骑士王子DARYLL DEANLOP 504骑士决战CHRISTINE FEEHAN 504骑士自由CHRISTINE FEEHAN唯一的书应该是列出的是504的作者,因为数据库中有多个,无法正确格式化。但作者id 504在数据库中有两本书。所以我只想把这两本书列出来,因为所有其他作者只有一本书db@ReneCanter:更新了我的答案,以找出使用CTE的不止一本书的作者(适用于许多RDBMS-很遗憾,您没有提到您使用的是哪一本),谢谢您的帮助!!不知道为什么它仍然出错。奥德确实列出了一些有用的东西。我真的很感激你的帮助!!!你们是最好的:-)这也列出了数据库中的所有书籍。“我只希望在多本书上列出作者的那些书显示出来。@Reneconter-Answer更新为只包括有作者或多本书的书。”。