如何外连接两个表(主表和多对一子表)以从第二个表中只获取一个项目?

时间:2009-03-20 18:50:13

标签: sql postgresql join outer-join

我有两个表是这样的:

主表:id(int),title(varchar)等。 子表:main_table_id(进入主表的外键),tag(varchar)等

主表中给定行可以有零个或多个子表行。

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

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

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

有人在他们的工具带上有这个技巧吗?

4 个答案:

答案 0 :(得分:4)

如果您使用的是SQL Server,则可以使用TOP子句。如果它不是SQL Server,你将不得不看看该数据库是否提供了相同的东西(其中很多都是这样)。像这样......

Select * from Main m
left outer join 
(select top 1 * from subtable s
  where s.main_table_id = m.id) q
on q.main_table_id = m.id;

注意:这是为了向您展示一般的想法。我没有机会运行它,因此可能需要进行一些更改,但概念就在那里。

答案 1 :(得分:2)

我最喜欢查理的答案,但我不确定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
)

答案 2 :(得分:0)

如果您只是检查第二个表中的某些内容与第一个表中的项目一起使用,您可以使用带有group by子句和聚合的外部联接:

select t1.[name], count(t1.[name]) as t2count
   from table1 t1
   left outer join table2 t2 on t1.fk = t2.pk
group by t1.[name]

然后,t2count为0的任何东西都是table2中没有任何内容的东西

编辑:实际上,我不记得t2count是否会为null或0 ...它应该是其中一个值。

答案 3 :(得分:0)

Postgres的滑稽方法(根本不是学校):

SELECT * 
 FROM main_table m left join (
   select (max(s::character varying)::subtable).* from subtable s group by main_table_id 
 ) s ON s.main_table_id = m.id

说明:
您选择完整记录作为一个字段:

select s from subtable s

您将其转换为不同的字符,以便能够使用max aggregat(或min ...)

 select max(s::character varying) from subtable s group by main_table_id

你只能通过main_table_id获得一行,其中包含代表你的记录的varchar,所以我们必须再次使用" subtable"并爆炸 - > (myvarchar ::子表)。*

select (max(s::character varying)::subtable).* from subtable s group by main_table_id 

您可以通过main_table_id

获得只有一行的表格子表格