首页 文章

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

提问于
浏览
1

我有两个表是这样的:

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

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

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

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

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

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

4 回答

  • 0

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

    如果您使用的是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;
    

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

  • 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中没有任何内容的东西

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

  • 4

    Postgres中的有趣方法(根本不是schooll):

    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 :: subtable) . *

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

    您可以通过main_table_id获得只有一行的表格子表格

相关问题