当前位置: 首页 > 面试题库 >

一对多加入并检索单个结果

罗乐意
2023-03-14
问题内容

我有两个表,如果有关系的话,在PostgreSQL中有一对多的关系。我需要加入它们,以便对于每个“一个”,我只能从“许多”表中获得单个结果。不仅如此,我还需要从“许多”表中挑选出特定的结果。

TABLE_A
ID  | NAME      | DATE          | MORE COLS....
1   | JOHN      | 2012-01-10    | ....
2   | LIZA      | 2012-01-10    | ....
3   | ANNY      | 2012-01-10    | ....
4   | JAMES     | 2012-01-10    | ....
...

TABLE_B
ID  | CODE1     | CODE2     | SORT
1   | 04020     | 85003     | 1
1   | 04030     | 85002     | 4
2   | 81000     | 80703     | 1
3   | 87010     | 80102     | 4
3   | 87010     | 84701     | 5
4   | 04810     | 85003     | 1
4   | 04030     | 85002     | 4
4   | 04020     | 85003     | 1
...

QUERY RESULT
ID  | NAME      | DATE          | CODE1     | CODE2
1   | JOHN      | 2012-01-10    | 04020     | 85003
2   | LIZA      | 2012-01-10    | 81000     | 80703
3   | ANNY      | 2012-01-10    | 87010     | 80102
4   | JAMES     | 2012-01-10    | 04810     | 85003
...

TABLE_B中的SORT列实际上是CODE2中的最后一个字符。CODE2可以以1-9结尾,但是3最重要,那么5、7、4、2、1、0、6、8、9因此3->
1,5-> 2,7-> 3等等向前。

我面临的问题是我需要TABLE_B中的行,其中sort是最低的数字。在某些情况下,存在多个最低的情况(请参见TABLE_B中的ID =
4),那么选择哪个具有最低ID的行并不重要,只有该ID有一个结果。


问题答案:

PostgreSQL的更简单,更短,更快DISTINCT ON

SELECT DISTINCT ON (a.id)
       a.id, a.name, a.date, b.code1, b.code2
FROM   table_a a
LEFT   JOIN table_b b USING (id)
ORDER  BY a.id, b.sort

此紧密相关答案中的详细信息,解释,基准和链接。
我使用LEFT JOIN,这样不会删除table_a没有匹配行的行table_b

旁注:

虽然在PostgreSQL中被允许,但date用作列名是不明智的。在每个SQL标准中,它都是保留字,在PsotgreSQL中,它是类型名。

命名ID列也是一种反模式id。没有描述性,也没有帮助。一种(多种)可能的命​​名约定是在表作为主键的情况下对其进行命名table_a_id。引用它的外键使用相同的名称(如果没有其他自然名称优先)。



 类似资料:
  • 问题内容: 我正在使用Laravel 4,我需要在MySQL表中插入一些行,并且需要找回插入的ID。 对于单行,我可以使用,但是它不支持多行。如果我至少能像普通的MySQL一样检索第一行的ID,就足以找出其他的ID。 问题答案: 根据用户Xrymz的建议,返回第一个。 根据Schemaapi 接受数组 所以你必须能够 就是说,如果使用MySQL,则可以由此检索第一个ID并计算其余的ID。还有一个功

  • 我已经在我的Laravel应用程序中实现了ZendSearch。我使用它作为我的搜索引擎,用户将键入一个搜索词,然后将返回一个按相关性排序的结果数组。但是,返回的数组只返回我的记录ID(它不返回任何实际的记录信息)。 接下来查询我的模型以基于数组结果检索结果的正确方法是什么?该数组结果只是一个基于相关性排序的ID数组。 我知道会返回ID为1的记录,但我如何向方法提供我希望按给定顺序返回的ID数组。

  • 问题内容: 我一直在尝试遵循Celery的“ Celery第一步与后续步骤”指南。我的设置是Windows 7 64位,Anaconda Python 2.7(32位),已安装的Erlang 32位二进制文​​件,RabbitMQ服务器和celery(带有)。 按照指南,我创建了一个带有 init .py,tasks.py和celery.py的proj文件夹。我的 init .py是空的。这是ce

  • 我有一个Laravel 5.8项目,我需要加入3个表来显示一些结果。 基本上,我已经将所有自定义id存储在一个名为的表中。 例如,这里有两个自定义ID,我需要检索它们的: 所以我试了一下: 但这是错误的,并向我展示了错误: SQLSTATE[42000]:语法错误或访问冲突:1066不唯一 所以我需要这样说: 然后: 我该怎么做呢?

  • 问题内容: 我在Java中有这样的双重经历。 现在,我想做的是通过循环在列表的零索引中添加5个值,在索引1中添加5个值。 第零个索引将具有值 索引1将具有值 并且所有这些值都按以下顺序存储在双精度数组中 我该怎么做? 问题答案: @Ahamed有一点,但是如果您坚持使用列表,那么可以有三个这样的arraylist: 编辑: 如果您在下面的列表中有这些值: 你想做的就是把它们结合起来,对吗?您可以尝

  • 问题内容: 这很难解释,但我会尽力而为。 我有2个具有多对多关系的桌子;有一个定义关系的链接表。这些表分别命名为Question,QuestionTopic和Topic。主题具有字段TopicID和TopicName.Question具有字段QuestionID和QuestionText。 我想检索主题列表以及属于该主题的问题数量。但是,可以将主题归为一组,并且应该知道该组合所独有的问题数。举个例