我有一个包含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;
我想到的一切都因为“没有表达式组合”而导致语法错误。
我应该进行嵌套查询吗?如果是这样,我应该在“哪里”输入相同的内容? 我很困惑。任何帮助,将不胜感激。
答案 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