PostgreSQL ПРИСОЕДИНЯЙТЕСЬ К СИНТАКСУ ДВУХ ТАБЛИЦ - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь найти решение для моей проблемы, но часы размышлений и поиска не помогли.Поэтому я подумал, может быть, я мог бы спросить это здесь.

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

Table: Project

projectid  | projectName | projectInformation | totalPrice |  projectStatus  
-------------- ------------  -------------------  ----------    -------------
  1          "Education"     "Information..."      2000          FALSE    
  2          "Hospital"      "Information..."      3000          TRUE
  3          "Water"         "Information..."      1000          TRUE


  Table: Donations
  donationid | donationamount | date | costumerid | projectid
  ----------   --------------   ----   ----------   ---------
  1               10            now()   3            1
  2               20            now()   1            2
  3               50            now()   2            2
  4               15            now()   4            3

Я хочу заархивировать следующие результаты:

projectid | projectname | projectinformation | totalprice | projectstatus | sum(amount)
1            "Education"     "information..."    2000          FALSE          325
2            "Hospital"      "information..."    3000          TRUE           
3            "Water"         "information..."    1000          TRUE           120

Так что клиенты могутпожертвовать сумму топора для проекта.

Я хочу показать собранную сумму денег за каждый проект.Когда я делаю следующий запрос, он дает мне только проекты с пожертвованиями.Я также хочу показать все проекты, если пожертвований еще нет, и указать в качестве суммы по умолчанию, например, 0 долларов США.

Это был мой запрос, который дает только проект с пожертвованиями:

select projectid, projectname, projectinformation, totalprice, projectstatus, sum(amount) 
from project 
     natural join donation 
group by projectid, projectname, projectinformation, totalprice, projectstatus;

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

1 Ответ

0 голосов
/ 10 июня 2018

Вы бы использовали left join:

select p.projectid, p.projectname, p.projectinformation, p.totalprice, 
       p.projectstatus, coalesce(sum(d.amount), 0)
from project p left join
     donation d
     on p.project_id = d.project_id
group by p.projectid, p.projectname, p.projectinformation, p.totalprice, p.projectstatus;

Я настоятельно не рекомендую вам использовать natural join.Отсутствие клавиш join затрудняет выполнение запроса и его отладку.Вы можете легко ошибиться с неправильными ключами, используемыми для join.

Я на самом деле считаю natural join мерзостью, потому что это зависит от имен столбцов, а не от формально объявленныхотношения внешнего ключа - «мерзость» - это мое описание игнорирования таких намеренно объявленных отношений.Если вы хотите короткую руку, предложение using может быть весьма полезным.

...