【问题标题】:SQL join arbitrary information to form a mixed listSQL join任意信息形成混合列表
【发布时间】:2017-06-20 05:12:23
【问题描述】:

我有一个不同类型的项目列表及其各自的 ID。项目将按组 ID 分组:

Type  | ID   | GroupID
-----------------------
Type1 | 1234 | 1 
Type1 | 2345 | 1 
Type2 | 1234 | 1 
Type3 | 1234 | 1 
Type1 | 1234 | 2 

每种类型都有单独的表格。这些模式彼此完全无关,因此UNION 不是一种选择:

Type1 <id, name, status>
Type2 <id, name, description, foo, bar>
Type3 <id, name, foobar, barfoo, foofoo, hoodeedoo>

有没有办法将所有数据加入到一个列表中。随着时间的推移,我们将添加更多类型,并且将按组加载列表。查询 Group 1 的上述数据集将返回以下 [pseudo] 数据:

[
  { 1234, name, status }, // Type 1
  { 2345, name, status }, // Type 1
  { 1234, name, description, foo, bar }, // Type 2
  { 1234, name, foobar, barfoo, foofoo, hoodeedoo } // Type 3
]

(更新)此请求的目的:

我们的 UI 将显示此项目列表。我们将有条件逻辑来改变点击项目的行为。例如,如果单击 Type1 项目,则运行 Type1 的行为 - 其他类型以此类推。

【问题讨论】:

  • 您能解释一下您要解决的问题吗?我可以考虑返回字符串或 XML 值,但这实际上取决于您将如何使用数据,以及为什么要将非同质列表放在一个响应中。
  • 你可以使用 JSON 作为返回类型吗?
  • 我更新了问题以描述我们为什么需要这样的数据。这并不理想,我知道。可能不得不回到绘图板上。
  • @joanolo - 这是最后的解决方案,看起来可能是我们唯一的选择。我主要是想看看是否有一些我不知道的 SQL 特性。

标签: sql postgresql join union


【解决方案1】:

如果你想要一个具有可变结构的结果,你最好的选择是 JSON。以下查询将联合查看type_1type_2type_3 的结果,并将结果作为JSON 提供给您:

SELECT 
    json_agg(r) AS result
FROM
(
    SELECT row_to_json(t) AS r
       FROM type_1 t
            JOIN item_list il ON il.type='Type1' AND il.id = t.id
    UNION ALL
    SELECT row_to_json(t) AS r
       FROM type_2 t
            JOIN item_list il ON il.type='Type2' AND il.id = t.id
    UNION ALL
    SELECT row_to_json(t) AS r
       FROM type_3 t
            JOIN item_list il ON il.type='Type3' AND il.id = t.id
) AS s0 ;

这就是你会得到的:

|                                            result                                                         |
|-----------------------------------------------------------------------------------------------------------|
| [{"id":1234,"name":"name","status":"status"},                                                             |
|  {"id":1234,"name":"name","status":"status"},                                                             |
|  {"id":2345,"name":"name-2","status":"status-2"},                                                         |
|  {"id":1234,"name":"name","description":"description","foo":"foo","bar":"bar"},                           |
|  {"id":1234,"name":"name","foobar":"foobar","barfoo":"barfoo","foofoo":"foofoo","hoodeedoo":"hoodeedoo"}] |

您可以查看SQLFiddle


注意:SQL 的编写方式保证任何顺序。如果需要,您应该在聚合之前添加适当的ORDER BY

【讨论】:

  • 太棒了 - 我喜欢 postgres。正是我想要的!
【解决方案2】:

免责声明:即使您进行了澄清,我也不知道这对您是否是一个好的解决方案,只是它是一个解决方案。

您可以使用字符串连接和UNION。它使您的查询变得非常复杂,但这当然是可能的。

而不是

SELECT * FROM type1
  UNION ALL
SELECT * FROM type2
  UNION ALL
  ...

你可以的

SELECT id, name, status AS info FROM type1
  UNION ALL
SELECT id, name, description || foo || bar AS info FROM type2
  UNION ALL
SELECT id, name, foobar || barfoo || foofoo || hoodeedoo AS info from type3
  ...

返回的表格数据如下:

  id  |  name  |            info
------+--------+-----------------------------
 1234 |  name  | status
 2345 |  name  | status
 1234 |  name  | descriptionfoobar
 1234 |  name  | foobarbarfoofoofoohoodeedoo

...等等。

为了可读性,您可能希望在其中连接一些空格。 description || ' ' || foo || ' ' || bar 之类的东西,或者其他类型的分隔符。 SQL 字符串操作不是很好,但它是可能的,它可能会为你解决这个问题。

【讨论】:

  • 嘿,谢谢你的技术。 row_to_json 解决方案正是我所需要的。对于非 postgres sql 存储来说,这肯定是次优且可行的。
猜你喜欢
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
相关资源
最近更新 更多