gpt4 book ai didi

Oracle:我可以避免很多 JOIN 吗?

转载 作者:行者123 更新时间:2023-12-04 10:09:48 24 4
gpt4 key购买 nike

我在 Oracle 12c 中有以下表:

  • objects (约60万行)
  • attributes (约10M线)

  • 我需要将对象的属性转换到另一个表中。这个想法如下图所示。

    为此,我现在使用了很多“连接”,例如:
    SELECT
    o.id,
    o.name,
    a1.value as attr_1,
    a2.value as attr_2,
    a3.value as attr_3,
    a4.value as attr_4,
    a5.value as attr_5
    FROM objects o
    LEFT JOIN attributes a1 ON a1.obj_id = o.id AND a1.attr_id = 1
    LEFT JOIN attributes a2 ON a2.obj_id = o.id AND a2.attr_id = 2
    LEFT JOIN attributes a3 ON a3.obj_id = o.id AND a3.attr_id = 3
    LEFT JOIN attributes a4 ON a4.obj_id = o.id AND a4.attr_id = 4
    LEFT JOIN attributes a5 ON a5.obj_id = o.id AND a5.attr_id = 5

    我有一些查询多达 20 个属性,所以我必须 JOIN “10 M 行”-表 20 次。

    它有效,但需要很多时间。

    你有什么好主意如何更好地组织它吗?

    enter image description here

    最佳答案

    正如评论中提到的,一种可能性是在 SELECT 上使用 PIVOT 选项。我不清楚您对此有何担忧 - 您只是说您想自己确定实际的结果列名称吗?您可以在 PIVOT 操作后轻松地为列设置别名。

    在 PIVOT 出现之前,我使用并看到其他人使用的标准方法是这样的:

    SELECT obj_id,
    MAX(CASE WHEN attr_id = 1 THEN value ELSE NULL) AS attr_1,
    MAX(CASE WHEN attr_id = 2 THEN value ELSE NULL) aS attr_2,
    ... etc. ...
    FROM attributes
    GROUP BY obj_id

    对于完整查询,您可以将此子查询放在 CTE 中并将其与 objects 连接起来。 .

    请注意,这并不一定意味着 Oracle 将在执行连接之前执行整个子查询。在你的情况下它可能,因为我假设每一行 objectsattributes 中有相应的行.但是如果你在 obj_id 上有一个过滤器在查询中,它可能会先过滤然后进行分组。无论如何,我当然希望这比多次加入更有效率。

    关于Oracle:我可以避免很多 JOIN 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61387308/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com