从两个不同的表中减去列的值

时间:2019-05-01 13:36:29

标签: sql postgresql

我想从一个表列中获取值,并从另一表中的另一列中减去这些值。

我能够通过联接这些表,然后彼此减去两列来实现这一目标。

第一个表中的数据:

SELECT max_participants FROM courses ORDER BY id;

第二个表中的数据:

SELECT COUNT(id) FROM participations GROUP BY course_id ORDER BY course_id;

以下是一些代码:

SELECT max_participants - participations AS free_places FROM
(
SELECT max_participants, COUNT(participations.id) AS participations
FROM courses
INNER JOIN participations ON participations.course_id = courses.id
GROUP BY courses.max_participants, participations.course_id
ORDER BY participations.course_id
) AS course_places;

通常,它可以工作,但是我想知道,是否有某种方法可以简化它,或者我的方法不正确,并且此代码在某些情况下不起作用?也许需要优化。

我已经阅读了一些有关不依赖数据库结果集自然顺序的信息,这些信息使我怀疑。

1 个答案:

答案 0 :(得分:0)

如果您希望每个课程 值,我建议:

SELECT c.id, (c.max_participants - COUNT(p.id)) AS free_places
FROM courses c LEFT JOIN
     participations p
     ON p.course_id = c.id
GROUP BY c.id, c.max_participants
ORDER BY 1;

请注意LEFT JOIN,以确保包括所有课程,即使没有参与者也是如此。

总人数有些trick漏。一种方法是将以上内容用作子查询。另外,您可以预汇总每个表:

select c.max_participants - p.num_participants
from (select sum(max_participants) as max_participants from courses) c cross join 
     (select count(*) as num_participants from participants from participations) p;