我有一张桌子,里面有一堆零件.这些部件有制造商提供的ID和序列号.部件被组装在一起来构建部件,而部件的组装顺序很重要.当完成此装配时,将创建一个新部件,该部件将进入一个新表,该表具有一个数组,该数组指向第一个按ID顺序排列的表.换句话说:

表"process.parts":

id serial_no
1 PART_A01
2 PART_A02
3 PART_A03
4 PART_A04
5 PART_A05
6 PART_A06

表"process.assemblies":

id assembly_order
1 {3, 6, 1}
2 {5, 2, 4}

我需要从表2中 Select 一个程序集并按程序集的顺序显示它.换句话说,组件1的 Select 应显示:

output
PART_A03
PART_A06
PART_A01

我用来 Select 部件的SQL命令如下所示:

SELECT id, serial_no
FROM process.parts
WHERE id IN (SELECT unnest(assembly_order) FROM process.assemblies WHERE id = 1);

此脚本不保留数组中的顺序.有没有办法修改它以循环访问数组的元素以保持顺序?

推荐答案

根据您当前拥有的架构,您可以:

  • Select 您需要的ID
  • 取消嵌套对应的"assembly_order"字段
  • 与匹配ID上的零件表联接

为了保持数组元素的顺序不变,您可以使用WITH ORDINALITY子句,它允许您在未嵌套的数组旁边检索索引.

SELECT cte.id
FROM       (SELECT assembly_order FROM assemblies WHERE id = 1) a 
CROSS JOIN UNNEST(a.assembly_order) WITH ORDINALITY cte(id, idx) 
INNER JOIN parts p
        ON p.id = cte.id
ORDER BY cte.idx

如果您想要所有ID,您可以在步骤1中使用整个表,而不是 Select 它.

Output:

serial_no
PART_A03
PART_A06
PART_A01

查看演示here.

Sql相关问答推荐

Oracle SQL中的累计总数

在SQL中向每个子字节组添加字节行

Trino/Presto sq:仅当空值位于组中第一个非空值之后时,才用值替换空值

我如何计算字母a出现的字符串的次数?

导出部分条形码字符串GS1-128

Oracle中的时间戳

缺少日期标识

使用拆分器将已分组的不同值连接在一起

如何在 golang squirrel lib 中添加 postgreSQL 的distinct on

对现有记录进行分组

如何在 SQL Server 中解决这个复杂的窗口查询?

SQL 搜索 - 获取最大值日期的奇怪行为

如何根据 Google BigQuery 中的特定列值连接一列的 N 行?

汇总具有连续日期范围的行

获取 SQL Server 中每一行的两个-之间的文本

在 MySql 数据库中的两个日期之间搜索

在 SQL 的每行选项中 Select 最大值

CURRENT_ROW 窗口框架上的 SQL 滞后

删除具有相同 ID 的重复记录 - Postgresql

REGEXP 用于字符串格式化以对用空格分隔的字符和数字进行分组