PSQL Это законный способ использовать подзапросы? - PullRequest
0 голосов
/ 12 января 2019

Я готовлюсь к экзамену по системам управления базами данных, и есть кое-что, в чем я не совсем уверен, законно это или нет.

В базе данных клуба меня просят вернуть имя, адрес электронной почты и сумму (для оплаты в год).

  • Если человек является «SinglePerson», сумма составляет 20 .--,
  • если это организация, сумма 150.--

База данных выглядит так:

Table Membership
(
    id serial PRIMARY KEY,
    email text NOT NULL,
    ... --unnecessary
)

Table Organisation
(
    id int REFERENCES Membership(id) PRIMARY KEY,
    "name" varchar Not NULL
    ... -- unnecessary
)

Table SinglePerson
(
    id int REFERENCES Membership(id) PRIMARY KEY,
    "name" varchar NOT NULL
)

Запрос выглядит так:

SELECT 
    Name, Email, Amount
FROM
    (SELECT 
         E.Name, M.Email, 20 AS Amount
     FROM 
         SinglePerson AS E
     JOIN 
         Membership As M ON M.Id = E.Id),
    (SELECT 
         O.Name, M.Email, 150 AS Amount
     FROM 
         Organisation AS O
     JOIN 
         Membership AS M ON M.Id = O.Id);

Возможен ли этот запрос?

Есть ли лучший способ сделать это?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Я бы сделал:

select
  m.name,
  m.email,
  case when s.id is not null then 20
       when o.id is not null then 150
       else null
  end as amount
from membership m
left join singleperson s on s.id = m.id
left join organisation o on o.id = m.id
0 голосов
/ 12 января 2019

Нет никаких законов о подзапросах - только синтаксические ошибки. Но в статьях FROM должен быть закон, запрещающий запятые. Научитесь использовать правильный, явный, стандартный JOIN синтаксис.

Хотя я бы написал запрос по-другому, похоже, вы стремитесь к типу запроса UNION ALL:

SELECT sp.Name, M.Email, 20 AS Amount
FROM SinglePerson sp JOIN
     Membership M
     ON M.Id = sp.Id
UNION ALL
SELECT O.Name, M.Email, 150 AS Amount
FROM Organisation O JOIN
     Membership M
     ON M.Id = O.Id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...