【发布时间】:2020-10-29 04:56:44
【问题描述】:
我有以下数据库:
CREATE TABLE Book (title VARCHAR(80), author VARCHAR(80), genre VARCHAR(80));
CREATE TABLE Review (reviewername VARCHAR(80), title VARCHAR(80), rating VARCHAR(10));
CREATE TABLE Reviewer (reviewername VARCHAR(80), genre VARCHAR(80));
我想查找所有评论者所评论的涵盖该类型的书籍 书。换句话说,分类为 G 类型的标题在答案 iff 中 每个涵盖类型 G 的评论家都写过这篇文章的评论。 注意:如果某些类型 G 未被任何评论者涵盖,则所有书籍 其流派是 G 应该在答案中。答案应该有 一个属性标题。
我的想法是计算每本书的评论数。
Select COUNT(B.title) FROM Book B, Review R
where B.title=R.title Group by B.title;
并且还要统计每个流派的审稿专家数量:
Select COUNT(R.reviewername) FROM Review R, Reviewer V
WHERE V.reviewername=R.reviewername group by V.genre;
然后比较这两个计数是否相等。如果它们相同,则意味着特定类型的所有专家都审查了所有书籍。但是当我尝试比较计数时:
Select B.title FROM Book B
WHERE
(Select COUNT(R.reviewername)
FROM Review R, Reviewer V
WHERE V.reviewername=R.reviewername group by V.genre) = (Select COUNT(B.title)
FROM Book B, Review R
where B.title=R.title Group by B.title);
我得到错误:
子查询返回多于 1 行
请注意,我不想使用 JOIN。
示例数据和表定义:
CREATE TABLE Book (title VARCHAR(80), author
VARCHAR(80), genre VARCHAR(80));
CREATE TABLE Review (reviewername VARCHAR(80), title VARCHAR(80), rating VARCHAR(10));
CREATE TABLE Reviewer (reviewername VARCHAR(80), genre VARCHAR(80));
INSERT INTO Book VALUES ("Learning SQL", "Victor", "Education");
INSERT INTO Book VALUES ("Learning SQL Part 2", "Victor", "Education");
INSERT INTO Book VALUES ("Learning SQL Part 3", "Victor", "Education");
INSERT INTO Book VALUES ("How to Save Money", "Victor", "Finance");
INSERT INTO Book VALUES ("The search for faith", "Chandler", "Religion");
INSERT INTO Review VALUES ("Ebert", "Learning SQL", "A");
INSERT INTO Review VALUES ("Ebert", "Learning SQL Part 2", "B");
INSERT INTO Review VALUES ("Hugo", "How to Save Money", "C");
INSERT INTO Review VALUES ("Todd", "How to ace the interview", "A");
INSERT INTO Review VALUES ("Todd", "How to ace the interview 2", "A");
INSERT INTO Review VALUES ("Gary", "The search for faith", "A");
INSERT INTO Review VALUES ("Jim", "Learning SQL", "B");
INSERT INTO Review VALUES ("Jim", "Learning SQL Part 3", "A");
INSERT INTO Reviewer VALUES ("Ebert", "Education");
INSERT INTO Reviewer VALUES ("Hugo", "Finance");
INSERT INTO Reviewer VALUES ("Gary", "Religion");
INSERT INTO Reviewer VALUES ("Jim", "Education");
INSERT INTO Reviewer VALUES ("Ramsey", "Finance");
【问题讨论】:
-
除了最终的解决方案之外,这些计数查询真的有效吗?您尚未在
select子句中指定group by列 -
发生错误,因为您在内部查询中有 group by。您可以使用 join 让生活更轻松,也可以使用
exists子句进行比较。 -
它们分开工作,但我的问题是如何在一个查询中比较它们。按原样比较时出现错误。
-
我也尝试了多个 Exists 查询,但也失败了。你能告诉我如何使用 Exists 来解决这个问题吗?
-
请添加一些示例数据和预期输出