How to solve this using a subquery in a from clause?

南笙酒味 提交于 2020-01-03 05:23:12

问题


Display author, title, retail and retail price of all books whose retail price is the highest for the specific author.

I have the query below. I'm kinda confused how to do a subquery in a from clause.

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

Below is the data from the database that I'm using

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.

回答1:


You could use this:

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
    ); 

Do not use NATURE JOIN. This is bad way of join, for all learner and programmer.

(And change author_id, book_id to column name of your specific table)

Other way:

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
 ; 



回答2:


This can be solved using ether an inner join:

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

or a correlated subquery:

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); 

Please note, because you are using the natural join it is impossible for us to know the actual column names you used for the joins. Therefore I have assumed that the authorid foreign key is called authorid



来源:https://stackoverflow.com/questions/42430671/how-to-solve-this-using-a-subquery-in-a-from-clause

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!