PostgreSQL:按数组元素从另一个表中选择数据,然后按顺序显示

vfh0ocws  于 2023-05-28  发布在  PostgreSQL
关注(0)|答案(2)|浏览(152)

我有一张table,上面放着一堆零件。这些部件具有制造商提供的ID和序列号。部件被放在一起以构建组件,并且部件被组装的顺序很重要。当进行此装配时,将创建一个新零件,该零件将进入一个新表,该表具有一个数组,该数组指向具有有序id的第一个表。换句话说:
表“工艺.部件”:
| id|序列号|
| - -----|- -----|
| 一个|PART_A01|
| 2| PART_A02|
| 3| PART_A03|
| 4| PART_A04|
| 5个|PART_A05|
| 六|PART_A06|
表“process.assemblies”:
| id|装配顺序|
| - -----|- -----|
| 一个|{3,6,1}|
| 2| {5,2,4}|
我需要从表2中选择一个组件,并按组件顺序显示它。换句话说,组件1的选择应显示:
| 输出|
| - -----|
| PART_A03|
| PART_A06|
| PART_A01|
我用来选择部件的SQL命令如下所示:

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

此脚本不保留数组的顺序。有没有一种方法可以修改它来循环遍历数组的元素以保持顺序?

fhity93d

fhity93d1#

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

  • 选择您需要的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中使用整个表,而不是选择它。

输出

| 序列号|
| - -----|
| PART_A03|
| PART_A06|
| PART_A01|
查看演示here

anauzrmj

anauzrmj2#

我相信你现在不想听到这个,但这不是组织这些数据的正确方法。应该有一个parts表、一个assembly表和一个链接两者的assembly_order表,每行一个步骤。比如:
工艺装配订单
| 部分|梯级|装配|
| - -----|- -----|- -----|
| 一个|一个|3|
| 一个|2|六|
| 一个|3|一个|
| 2|一个|5个|
| 2| 2| 2|
| 2| 3| 4|
现在你可以

SELECT part,assembly FROM parts,assembly_order WHERE assembly_order.part = parts.id ORDER BY part, step;

相关问题