как мне взять результаты моих подзапросов, чтобы объединить их с другой таблицей? - PullRequest
1 голос
/ 10 ноября 2019

. пытается связать результаты заемщика, книги, с AUTHOR.

желаемые результаты:

AUTHORID         AUTHORFIRSTNAME      AUTHORLASTNAME
1                     JIM                   SPARKS
2                     JAMES                 ALLEN
3                     MARCUS                RASHFORD
20                    PAUL                  POGBA
22                    THIERRY               HENRY

, но я не уверен, как связать возвращенные главные авторы для получения имени автора и фамилии, ноя не упомянул таблицу автора в подзапросе

Ответы [ 2 ]

1 голос
/ 10 ноября 2019

Вы можете объединить эти три таблицы вместе с аналитической функцией rank() в порядке убывания для count в подзапросе, а затем принять меньше, чем пять в основном запросе:

SELECT authorid, authorfirstname, authorlastname
  FROM
  (
  SELECT a.authorid, a.authorfirstname, a.authorlastname, 
         rank() over (order by count(*) desc)  as rnk
    FROM AUTHOR a
    LEFT JOIN BOOK bk ON a.authorid = bk.authorid
    LEFT JOIN BORROWER br ON br.bookid = bk.bookid
   WHERE br.borrowdate between date'2017-01-01' and date'2017-12-31'
   GROUP BY a.authorid, a.authorfirstname, a.authorlastname
   )
  WHERE rnk <= 5
  ORDER BY rnk

Есливы используете БД версии 12c +, проще извлечь их:

SELECT a.authorid, a.authorfirstname, a.authorlastname, 
       rank() over (order by count(*) desc)  as rnk
  FROM AUTHOR a
  LEFT JOIN BOOK bk ON a.authorid = bk.authorid
  LEFT JOIN BORROWER br ON br.bookid = bk.bookid
 WHERE br.borrowdate between date'2017-01-01' and date'2017-12-31'
 GROUP BY a.authorid, a.authorfirstname, a.authorlastname
 ORDER BY rnk 
 FETCH FIRST 5 ROWS WITH TIES

, где я использовал br.borrowdate between date'2017-01-01' and date'2017-12-31' вместо to_char(br.borrowdate) like '%2017', чтобы иметь возможность использовать индекс для столбцаborrowdate если существует любой.

Эти запросы возвращают строки со связями, например, они приносят больше строк, чем пять, при условии, что несколько строк соответствуют значению 5-й строки.

Doне используйте rownum псевдостолбец для ранжирования, так как его значение вычисляется до упорядочения и может привести к неверным результатам.

0 голосов
/ 10 ноября 2019

Итак, если я правильно понял, вы хотите сделать что-то вроде этого:

select authorid, authorfirstname, authorlastname 
 from 
  (select a.authorid, a.authorfirstname, a.authorlastname 
   from author a, borrower b, book c 
   where a.authorid = c.authorid and c.bookid = b.bookid
   and b.borrowdate like '%2017' 
    group by c.bookauthor 
    order by count(*) desc) xx 
 where rownum <=5
...