DB2 SQL 如何从内部联接表返回 1 行

Posted

技术标签:

【中文标题】DB2 SQL 如何从内部联接表返回 1 行【英文标题】:DB2 SQL HOW TO RETURN 1 ROW ON JOIN TABLE FROM INNER JOIN TABLE 【发布时间】:2021-08-17 18:31:34 【问题描述】:
SELECT GARAGE, MAKE
FROM NEIGHBORHOOD_TABLE A
JOIN VEHICLES_TABLE B ON B.MAKE = A.MAKE DISTINCT BY B.MAKE
WHERE A.ZIPCODE = MY_ZIP_CODE
;

现在我想用福特品牌退回我邮政编码中的所有车库。现在,Vehicles-Table 可以在连接时有多个 FORD Makes 模型,但我只想返回 1 行 FORD make 不是所有模型 FUSION、RANGER、F150 ....可能是一个不好的例子,但想法是我想要从表 A 返回与表 B 匹配的多行,但是表 B 可能有多个与表 A 匹配的行,但我只想要 1 行,与 B.MAKE 不同。

这是一个 DB2 SQL 数据库。 谢谢,如果你能弄清楚我在问什么。

【问题讨论】:

请提供实际数据集示例 【参考方案1】:

我能想到的最简单的解决方案是使用ROW_NUMBER()。例如

select *
from (
  select
    a.garage,
    a.make,
    row_number() over(partition by a.make order by b.id) as rn
  from neighborhood_table a
  join vehicles_table b on b.make = a.make
  where a.zipcode = 12345
) x
where rn = 1

请注意,当每个品牌有多个行时,您需要添加一个排序标准来决定选择哪一行;我添加了order by b.id,但您应该根据您的条件进行更改。

或者,您可以使用横向查询来获取每个组的单行。

【讨论】:

@NathanHughes ROW_NUMBER() 在 DB2 中运行良好。请参阅dbfiddle.uk/… 的运行示例 很好,我不知道,以为它是特定于 MS SQL 和 oracle 的。【参考方案2】:

试试这个:

SELECT A.GARAGE, A.MAKE
FROM NEIGHBORHOOD_TABLE A
JOIN 
(
SELECT DISTINCT MAKE
FROM VEHICLES_TABLE
) B ON B.MAKE = A.MAKE
WHERE A.ZIPCODE = MY_ZIP_CODE

【讨论】:

以上是关于DB2 SQL 如何从内部联接表返回 1 行的主要内容,如果未能解决你的问题,请参考以下文章

谁能告诉我,内部联接在 SQL 中是如何工作的?

SQL Server-交叉联接内部联接基础回顾

如何使用 Spark sql 在 Databricks 中使用内部联接更新 Databricks Delta 表

DB2 和 SQL-如何在特定字段中返回最大值,以便每行只显示一条记录;从多个表中提取数据

CakePHP:如何使用内部联接从两个表中检索数据?

特定列上的SQL内部联接