SQL отображение 10 лучших строк из нескольких таблиц - PullRequest
0 голосов
/ 26 февраля 2020

Я делаю упражнения самостоятельно, чтобы понять, как работает postgre SQL, и это о взглядах. Я не могу завершить этот, где я должен отобразить 10 самых больших объектов с наибольшим радиусом (планеты и спутники).

У меня есть 3 таблицы:

pl anet:

 id |  name   | population | radius | period | id_system 
----+---------+------------+--------+--------+-----------
  1 | Mercury |          0 |   2439 |     88 |         1
  2 | Venus   |          0 |   6051 |    224 |         1
  3 | Earth   | 7000000000 |   6371 |    365 |         1
  4 | Mars    |          0 |   3389 |    687 |         1
  5 | Jupiter |          0 |  69911 |   4331 |         1
  6 | Saturn  |          0 |  58232 |  10747 |         1
  7 | Uranus  |          0 |  25362 |  30589 |         1
  8 | Neptune |          0 |  24622 |  59800 |         1

planetary_system:

 id | name  | star 
----+-------+------
  1 | Solar | Sun

и спутник:

id |   name    | radius | id_planet 
----+-----------+--------+-----------
  1 | Moon      |   1737 |         3
  2 | Titan     |   2576 |         6
  3 | Ganymede  |   2634 |         5

Ожидаемый результат (отсортировано по радиусу DES C, имя):

   type    | system |   name   | radius
-----------+--------+----------+--------
 planet    | Solar  | Jupiter  |  69911
 planet    | Solar  | Saturn   |  58232
 planet    | Solar  | Uranus   |  25362
 planet    | Solar  | Neptune  |  24622
 planet    | Solar  | Earth    |   6371
 planet    | Solar  | Venus    |   6051
 planet    | Solar  | Mars     |   3389
 satellite | Solar  | Ganymede |   2634
 satellite | Solar  | Titan    |   2576
 planet    | Solar  | Mercury  |   2439

Мое решение, но мне не хватает столбцов, как я могу его изменить?

CREATE OR REPLACE VIEW view_biggest_entities(system, radius_) AS
    SELECT *
    FROM (SELECT planet.radius, satellite.radius
        FROM planet, satellite) AS rad
    ORDER BY rad DESC
    LIMIT 10;

1 Ответ

3 голосов
/ 26 февраля 2020

Вы можете использовать union all:

CREATE OR REPLACE VIEW view_biggest_entities(object_type, system, name, radius) AS
select 'planet' object_type, ps.name system, p.name, p.radius
from planet p
inner join planetary_system ps on p.id_system = ps.id
union all
select 'satellite' object_type, ps.name system, s.name, s.radius
from satellite s
inner join planet p on s.id_planet = p.id
inner join planetary_system ps on p.id_system = ps.id
limit 10;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...