2017-02-24 46 views
0

显示特定作者的零售价格最高的所有图书的作者,标题,零售和零售价格。如何使用from子句中的子查询解决此问题?

我有下面的查询。我有点困惑如何在from子句中做一个子查询。

select lname, fname, title, retail 
from author natural join bookauthor 
natural join books 
where retail=(select max(retail) 
       from books); 

下面是我使用

FNAME  LNAME  TITLE        RETAIL 
---------- ---------- ------------------------------ ---------- 
SAM  SMITH  BODYBUILD IN 10 MINUTES A DAY  30.95 
LISA  PORTER  BODYBUILD IN 10 MINUTES A DAY  30.95 
JANICE  JONES  REVENGE OF MICKEY      22 
TAMARA  KZOCHSKY BUILDING A CAR WITH TOOTHPICKS  59.95 
TINA  PETERSON DATABASE IMPLEMENTATION    55.95 
JUAN  ADAMS  DATABASE IMPLEMENTATION    55.95 
JAMES  AUSTIN  DATABASE IMPLEMENTATION    55.95 
JACK  BAKER  COOKING WITH MUSHROOMS    19.95 
JAMES  AUSTIN  HOLY GRAIL OF ORACLE    75.95 
LISA  WHITE  HANDCRANKED COMPUTERS     25 
WILLIAM WHITE  HANDCRANKED COMPUTERS     25 
JANICE  JONES  E-BUSINESS THE EASY WAY    54.5 
ROBERT  ROBINSON PAINLESS CHILD-REARING    89.95 
OSCAR  FIELDS  PAINLESS CHILD-REARING    89.95 
JACK  BAKER  PAINLESS CHILD-REARING    89.95 
SAM  SMITH  THE WOK WAY TO COOK     28.75 
ROBERT  ROBINSON BIG BEAR AND LITTLE DOVE    8.95 
SAM  SMITH  HOW TO GET FASTER PIZZA    29.95 
WILLIAM WHITE  HOW TO MANAGE THE MANAGER   31.95 
LISA  WHITE  SHORTEST POEMS      39.95 

20 rows selected. 
+0

您正在使用哪个数据库:

(和更改AUTHOR_ID,book_id您的具体表的列名)

其他办法吗?请显示表架构 – GurV

+0

@GurV我正在使用JustLee书籍数据库。 –

回答

1

您可以使用此:

SELECT lname, fname, title, retail 
FROM author a 
INNER JOIN bookauthor ba 
ON a.id = ba.author_id 
INNER JOIN books b 
ON b.id = ba.book_id 
WHERE (ba.author_id, ba.retail) IN (
    SELECT ba1.author_id, MAX(b1.retail) 
    FROM books b1 
    INNER JOIN bookauthor ba1 
    ON ON b1.id = ba1.book_id 
    GROUP BY ba1.author_id 
    ); 

不要使用NATURE JOIN。对于所有的学习者和程序员来说,这是一种不好的加入方式。

SELECT lname, fname, title, retail 
FROM author a 
INNER JOIN bookauthor ba 
ON a.id = ba.author_id 
INNER JOIN books b 
ON b.id = ba.book_id 
INNER JOIN(
    SELECT ba1.author_id, MAX(b1.retail) retail 
    FROM books b1 
    INNER JOIN bookauthor ba1 
    ON ON b1.id = ba1.book_id 
    GROUP BY ba1.author_id 
    ) mr 
ON 
    ba.author_id = mr.author_id 
    AND ba.retail = mr.retail 
; 
+0

谢谢!虽然我花了一段时间才明白它:)并且我会避免使用自然连接。我只使用它,因为它没有输入公共列而速度更快。 –

1

数据库中的数据这可以使用醚来解决内部联接:

select lname, fname, title, retail 
from author natural join bookauthor 
natural join books 
inner join (select max(retail) as max_retail, authorid 
      from books 
      group by authorid) b 
on books.authorid = b.authorid and books.retail = b.max_retail 

或相关子查询:

select lname, fname, title, retail 
from author natural join bookauthor 
natural join books 
where retail=(select max(retail) 
       from books b where b.authorid=author.authorid); 

请注意,是因为您使用的是natural join,我们无法知道您用于连接的实际列名。因此,我假定AUTHORID外键被称作authorid

相关问题