我一直在尝试完成以下任务:
撰写一个查询,返回在多个类别中撰写书籍并且其图书由至少两个不同发布商发布的作者。显示作者的姓氏和名字,他们撰写的书籍标题和书籍类型。按作者的姓氏对输出进行排序。
这些是涉及的表格:
AUTHORS (Au_id, Au_lname, Au_fname, Phone, Address, City, State, Country, Postalcode)
PUBLISHERS (Pub_id, Pub_name, City, State)
TITLES (Title_id, Title, Type, Pub_id, Price, Advance, Total_sales, Notes, Pubdate, Contract)
TITLEAUTHOR (Au_id, Title_id)
我能够识别我需要的列,但不确定如何实现过滤器(2个不同的作者,2种不同的类型)。我假设我需要按作者ID分组并计算Pub_id和Type列。
这是我到目前为止所写的:
SELECT AUTHORS.Au_lname, AUTHORS.Au_fname, TITLE.Title_id, TITLE.Type
from AUTHORS
JOIN TITLEAUTHOR ON AUTHORS.Au_id = TITLEAUTHOR.Au_id
JOIN TITLE ON TITLEAUTHOR.Title_i = TITLE.Title_i
group by AUTHORS.Au_lname, AUTHORS.Au_fname, TITLE.Title_id, TITLE.Type
ORDER BY AUTHORS.Au_lname;
答案 0 :(得分:1)
欢迎来到Stack Overflow,Tomasz!祝贺你的第一篇文章。你已经做了几件很棒的事情:
有几种方法可以改善您的帖子,这有助于您获得良好答案的机会,同时提高您参与社区的能力:
现在,关于你的问题!您正在寻找的是HAVING
子句,它允许您过滤查询以仅返回满足聚合级别条件的组的成员。你对COUNT的直觉是正确的,HAVING子句会让你这样做。这是一个例子:
SELECT Au_id
FROM
AUTHORS
INNER JOIN
TITLEAUTHOR ON
AUTHORS.Au_id = TITLEAUTHOR.Au_id
INNER JOIN
TITLES ON
TITLEAUTHOR.Title_id = TITLE.Title_id
GROUP BY Au_id
HAVING
COUNT(DISTINCT TITLES.pub_id) > 1 AND
COUNT(DISTINCT TITLES.Type) > 1
请注意,这会在DISTINCT
功能中添加单词COUNT()
- 这有助于您与两个不同的发布商会面#34;需求。
一旦你理解了如何使用HAVING
,那么你可以编写一个查询来获取你的作业要求的列,并过滤该集合只返回你想要的作者:基本的查询结构看起来像这样:
SELECT MyColumns
FROM MyTables
WHERE Au_id IN
(
SELECT Au_id
FROM
AUTHORS
INNER JOIN
TITLEAUTHOR ON
AUTHORS.Au_id = TITLEAUTHOR.Au_id
INNER JOIN
TITLES ON
TITLEAUTHOR.Title_id = TITLE.Title_id
GROUP BY Au_id
HAVING
COUNT(DISTINCT TITLES.pub_id) > 1 AND
COUNT(DISTINCT TITLES.Type) > 1
)
ORDER BY WhateverYouWant
祝你好运,欢迎来到SQL!