【问题标题】:Match an array of foreign keys in one table with primary key in another table?将一个表中的外键数组与另一个表中的主键匹配?
【发布时间】:2020-04-11 11:56:33
【问题描述】:

我有两张桌子。像这样的:

id   | array_of_ids
----------------------
 001 | {012, 345, 789}
 002 | {789, 123, 456}
 003 | {234, 789, 567}
 004 | {543, 210, 789}

另一个这样的:

 ids  | str
-------------
 012 | am_name1
 345 | name2
 789 | name3
 123 | am_name4
 456 | name5
 234 | name6
 567 | am_name7
 543 | am_name8
 210 | name9

我想创建一个如下所示的表:

id   | array_of_ids    | label
-----------------------------
 001 | {012, 345, 789} | name1
 002 | {789, 123, 456} | name4
 003 | {234, 789, 567} | name7
 004 | {543, 210, 789} | name8

我知道填充的标签看起来是随机的,但这里有一些详细信息:每个 id 都有一个对应的名称,但我只对特定类型的名称感兴趣——带有前缀“am”的名称。我希望能够扫描array_of_ids,检查数组中的id 是否与我感兴趣的str 匹配,并使用对应的名称填充一个新变量label。我希望这很清楚!如有必要,很高兴编辑!

【问题讨论】:

  • 什么时候数据库设计人员认为规范化他们的模型很重要?我是老派的。我不明白这需要在 one 字段中存储带有主键的数组。规范化规则编号 1 是?
  • 嗨@trincot,我没有设计桌子!数组不是主键。数组是外键。
  • 是的,关键是在一个字段中放置多个参考数据是很糟糕的设计。对于文本和其他仅提供有关核心数据的详细信息的信息来说,它的坏处较小,但即使这样也违反了正常形式。
  • 是的@trincot,我同意!

标签: sql arrays presto


【解决方案1】:

我意识到我没有使用 PRESTO 的 array functions。这个解决方案有点笨拙,因为它需要您在解决方案之外查找每个 id/name 对,但它确实有效。

SELECT id, array_of_ids,
  CASE WHEN CONTAINS(array_of_ids, 012) = TRUE THEN 'name1'
       WHEN CONTAINS(array_of_ids, 123) = TRUE THEN 'name4'
       WHEN CONTAINS(array_of_ids, 567) = TRUE THEN 'name7'
       WHEN CONTAINS(array_of_ids, 543) = TRUE THEN 'name8'
       ELSE NULL END AS label
FROM table1

【讨论】:

    【解决方案2】:

    unnest()join

    select t1.id, t1.array_of_ids,
           max(case when regexp_like(t2.name, '^am_') then substr(t2.name, 4) end)
    from table1 t1 cross join
         unnest(t1.array_of_ids) t1_id(id) join
         table2 t2
         on t2.id = t1_id.id
    group by t1.id, t1.array_of_ids;
    

    【讨论】:

    • 我要试试这个,我会回来报告的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多