admin

如何外部联接两个表(主表和多对一子表)以仅从第二个表中获得一项?

sql

我有两个这样的表:

主表:id(int),标题(varchar)等。子表:main_table_id(主表中的外键),标记(varchar)等。

对于主表中的给定行,可以有零个或多个子表行。

我想执行一个查询,该查询将返回主表的每一行,以及主表的列,以及仅来自子表的单行(无关紧要)的列,如果有的话,否则在这些列中为NULL。

当然,如果我只是做一个基本的LEFT OUTER JOIN,那么我当然会多次重复执行主表,子表中的每个匹配项都会重复一次。

我敢肯定,在使用LEFT OUTER JOIN之前,我已经看到了这一点,并且使用了某种技巧,迫使从子表中仅选择一行,而不是全部选择-
可能会选择最小或最大OID。但是,一个多小时的谷歌搜索没有产生任何解决方案。

有人在工具带上有这个把戏吗?


阅读 137

收藏
2021-07-01

共1个答案

admin

我最喜欢查理的答案,但是我不确定Postges是否具有TOP / LIMIT函数,因此这是一种不需要的替代解决方案(但假设sub_table具有一个名为“
id”的主键):

SELECT * 
FROM main_table m LEFT OUTER JOIN sub_table s 
ON s.main_table_id = m.id
WHERE s.id IS NULL OR s.id IN ( 
  SELECT MAX(id) FROM sub_table GROUP BY main_table_id
)
2021-07-01