我有两个这样的表:
主表:id(int),标题(varchar)等。子表:main_table_id(主表中的外键),标记(varchar)等。
对于主表中的给定行,可以有零个或多个子表行。
我想执行一个查询,该查询将返回主表的每一行,以及主表的列,以及仅来自子表的单行(无关紧要)的列,如果有的话,否则在这些列中为NULL。
当然,如果我只是做一个基本的LEFT OUTER JOIN,那么我当然会多次重复执行主表,子表中的每个匹配项都会重复一次。
我敢肯定,在使用LEFT OUTER JOIN之前,我已经看到了这一点,并且使用了某种技巧,迫使从子表中仅选择一行,而不是全部选择- 可能会选择最小或最大OID。但是,一个多小时的谷歌搜索没有产生任何解决方案。
有人在工具带上有这个把戏吗?
我最喜欢查理的答案,但是我不确定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 )