当count()= 2时,如何通过连接从两个不同的表中选择数据?

时间:2013-11-18 21:21:06

标签: sql oracle-sqldeveloper

我有一个包含3个表的数据库,如下所示

CREATE TABLE Person
(id_pers number (3),
 name varchar(20) NOT NULL,
 phone number (15),
 PRIMARY KEY(id_pers)
);

CREATE table Book(
   id_book number(3),
   title varchar(30),
   about varchar (200),
   nr_of_books number (3),
   type varchar (11),
   PRIMARY KEY(id_book)
);

CREATE table Author(
   id_book number(3),
   id_aut number(3),
   FOREIGN KEY (id_book) REFERENCES Book(id_book),
   FOREIGN KEY (id_aut) REFERENCES Person(id_pers)
);

我想要显示正好有2位作者的书的标题以及撰写该书的作者的姓名。示例“Book1 - Author1,Author2” 我设法做的就是拿出书籍ID和作者数量,但我更准确地想要它们。

我写的代码是:

SELECT au.id_book, count(au.id_aut)
FROM author au join book bk ON au.id_book = bk.id_book 
   JOIN person p ON p.id_pers = au.id_aut 
GROUP BY au.id_book
   HAVING COUNT(au.id_aut) = 2;

我想到的一切都因为“没有表达式组合”而导致语法错误。

我应该进行嵌套查询吗?如果是这样,我应该在“哪里”输入相同的内容? 我很困惑。任何帮助,将不胜感激。

4 个答案:

答案 0 :(得分:0)

这将在结果中包含您的标题,并且它不会给出有关丢失组的错误。我不确定这是你想要的,但是......

  SELECT au.id_book, bk.title, count(au.id_aut)
    FROM author au 
    JOIN book bk 
      ON au.id_book = bk.id_book 
    JOIN person p 
      ON p.id_pers = au.id_aut 
GROUP BY au.id_book, bk.title
  HAVING COUNT(au.id_aut) = 2;

为了包括作者的名字,我采取了一些更精细的方法:

DECLARE @result varchar(500)
DECLARE @numAut int

SET @result = ''
SET @numAut = 2

SELECT @result = @result + [Name] + ', ' 
  FROM person WHERE id_pers in 
      (SELECT id_aut FROM author WHERE id_book in
           (  SELECT id_book FROM author 
            GROUP BY id_book HAVING COUNT(*) = @numAut)
      );

  SELECT bk.title, @result
    FROM author au JOIN book bk ON au.id_book = bk.id_book 
GROUP BY au.id_book, bk.title
  HAVING COUNT(*) = @numAut;

首先,我们列举了出现在&n;作者和#34; -list中的作者的姓名。然后将此结果包含在(现在更简单)实际查询中,其中我基本上只选择同一列表中书籍的标题。

这有效,但我想知道是否有更优雅的方式......

答案 1 :(得分:0)

SELECT au.id_book, count(au.id_aut)as count
FROM author au join book bk ON au.id_book = bk.id_book 
   JOIN person p ON p.id_pers = au.id_aut 
GROUP BY au.id_book
   HAVING (count=2)

答案 2 :(得分:0)

鉴于您的数据结构,我不认为联接是必要的。

虽然您的查询看起来很好,但以下更简单的版本也可以使用:

SELECT au.id_book, count(au.id_aut)
FROM author au
GROUP BY au.id_book
HAVING COUNT(au.id_aut) = 2;

答案 3 :(得分:0)

为了显示书名和作者,您需要GROUP_CONCAT

SELECT au.id_book, bk.title, count(au.id_aut), GROUP_CONCAT(p.name) authors
FROM author au 
JOIN book bk ON au.id_book = bk.id_book 
JOIN person p ON p.id_pers = au.id_aut 
GROUP BY au.id_book, bk.title
HAVING COUNT(au.id_aut) = 2