【问题标题】:Oracle - explanation of hierarchical queryOracle——层次查询的解释
【发布时间】:2021-04-11 06:35:08
【问题描述】:

我有一个关于分层 SQL 的问题。

样本数据:

create table group_ (
group_id number);

create table set_(
set_id number);

insert into group_ values(1);
insert into group_ values(2);
insert into group_ values(3);
insert into set_ values(1);
insert into set_ values(2);

SQL:

SELECT  group_id,
        sys_connect_by_path(set_id, ', '), LEVEL
FROM    set_
CROSS   JOIN group_
CONNECT BY prior set_id < set_id
ORDER   BY group_id, combo nulls first,lvl;

我的目标是获得 2 个表的所有可能组合,并且它正在工作,但我有重复的值,所以我必须使用不同/唯一的 caluse。 问题是 - 它们为什么会出现?

【问题讨论】:

  • “它正在工作”?这不是真的(无论如何,不​​是您发布的查询;也许您运行了其他东西)。例如,您在order by 中有combolvl,但它们没有在查询中的其他任何地方定义。所以,让我们从那个开始。然后:“两张表的所有可能组合”是什么意思?我不知道那是什么意思。在您的查询中,您交叉加入group,但您不会在其他任何地方使用它。也许您打算先在set_ 上执行分层步骤,然后才将结果交叉连接到group?很难知道。
  • 为什么不简单地SELECT * FROM set_ CROSS JOIN group_?不清楚你想通过“所有可能的组合”得到什么
  • 注意函数GROUP_ID。您想获取表group_GROUP_ID 函数 还是?此外,CONNECT BY PRIOR set_id &lt; set_id 看起来至少“非常罕见”。

标签: sql oracle combinations hierarchical


【解决方案1】:

你正在做一个UNION ALL。实际上,您从group_ 中选择所有内容,然后在加入set_ 表后再次选择它。

更改为UNION,重复项将被删除。

见:http://sqlfiddle.com/#!4/7d079/3

【讨论】:

  • 我知道怎么剪。我想知道他们为什么出现在选择中
  • 因为您(在编辑问题之前)正在执行UNION ALL,这意味着您选择了整个group_ 表,然后作为同一结果的一部分还选择了您的结果第二个查询,所以你从group_ 得到了两次。
猜你喜欢
  • 2020-04-17
  • 2015-10-15
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多