2017-02-24 44 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

相關問題