我有兩個表,其中一個有一個唯一的 ID 列和一個包含陣列的列,這些陣列包含表 B 中唯一記錄的零個或多個識別符號。我試圖顯示每個專案使用的訂單,但我不能我想用一種方法來連接表 A 和 B,這樣不僅每個訂單或專案都有一行,而且所有訂單上都有盡可能多的專案
表一:
OrderID | Items | name
---------- ------------------ ------------
order1 | {item1,item2} | "Bob's pizza order"
order2 | {item3,item1} | "Alice's breakfast order"
表 B:
itemID | price | name
--------- ---------------- ------------
item1 | 2.95 | "cheese"
item2 | 3.15 | "tomato sauce"
item3 | 3.50 | "eggs"
所需的輸出將類似于
ItemID | OrderID | name
--------- ---------------- ------------
item1 | order1 | "cheese"
item1 | order2 | "cheese"
item2 | order1 | "tomato sauce"
item3 | order2 | "eggs"
有誰知道如何在表 A 中取消嵌套陣列,以便我可以使用所有專案將 A 和 B 與每個訂單的每個專案的記錄連接起來?
uj5u.com熱心網友回復:
要將每個專案作為一行,您需要取消嵌套您的陣列(基本上是動態規范化模型):
select b.itemid, a.orderid, b.name
from table_a a
cross join unnest(a.items) as i(item)
join table_b b on i.item = b.itemid
order by b.itemid;
在線示例
uj5u.com熱心網友回復:
看起來 postgresSQL 有一些我不習慣的很棒的功能!
查看其他一些檔案后,這可能會產生您正在尋找的效果 -
with table_a (OrderID, Items) as
(select 'order1', '{item1,item2,item4}' union all
select 'order2', '{item3,item1}'
)
,
trim as (
select OrderID, Replace(Replace(Items, '{', ''),'}','') as Items
from table_a)
SELECT
OrderID,
unnest(string_to_array(Items, ',')) AS ItemID
from trim
如果 Items 列是一個真正的陣列,您應該能夠洗掉修剪 CTE 并洗掉 string_to_array 函式。
整個事情可能看起來像 -
with unnested_data as(
SELECT
OrderID,
unnest(Items) AS ItemID
FROM table_a)
SELECT
a.ItemID,
a.OrderID,
b.name
FROM unnested_data AS a
JOIN table_b AS b
on a.ItemID = b.itemID
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/376777.html
標籤:sql 数组 PostgreSQL的 加入
下一篇:從命令列創建引數并保存在陣列中
