oracle sql中的动态列

Posted

技术标签:

【中文标题】oracle sql中的动态列【英文标题】:Dynamic column in oracle sql 【发布时间】:2017-01-21 11:11:04 【问题描述】:

我想在数据库中查询一些分类帐名(如子级)、分类帐组名(如父级,它是分类帐名的父级)和分类帐组名(或分类帐名)的所有升序父级。我正在从分类帐名和它的即时的 ACC_LEDGER 表中搜索数据称为 ledgergroupname 的父级被保存。ledgergroupname 的升序父级保存在 ACC_LEDGERGROUP 表中。 sql--

select 
pp.Ledgercode,
pp.Ledgername,
pp.Ledgergroupcode,
pp.Ledgergroupname,
(select Acc_Ledgergroup.Parentname from Acc_Ledgergroup where Acc_Ledgergroup.Ledgergrpcode=pp.Ledgergroupcode) as PARENTNAME

from     
    (select 
    LED.LEDGERCODE,
    Led.Ledgername,
    Led.Ledgergroupcode,
    Led.Ledgergroupname
    from ACC_LEDGER LED where Led.Ledgercode IN ('01003024007','01003024019'))pp

它给了我结果-- 我想要的是——

所以对于每个分类帐我想显示父级到根(它的级别对于不同的分类帐意味着对于某些分类帐它有 7 个上父级到达“根”父级)。

我正在尝试查询这样的内容(仅供您理解)--

select
pp.Ledgercode,
pp.Ledgername,
pp.Ledgergroupcode,
pp.Ledgergroupname,

(select Acc_Ledgergroup.Parentname from Acc_Ledgergroup where Acc_Ledgergroup.Ledgergrpcode=pp.Ledgergroupcode) as PARENTNAME


while(parentname != root)

  select parent name from Ledger group 

from the_table

所以表中的列选择或表的连接不是固定的,这取决于我有多少父级,我如何在 oracle sql 中做到这一点?

【问题讨论】:

查找递归分层查询。 我也试过启动和连接,但无法解决 必须为每个父级设置单独的列,否则 /root/primary/Current Asset 可以吗?如果不是,那么不同级别会发生什么 - 例如父行数为 5,而另一行数为 10?您最好在应用程序代码中执行所有这些操作。 @GurV 我想写一个查询,我的结果列号将根据我的父级别。例如。如果一条记录有 3 个父项,则列将为 5 (3+ledgername+ledgergroupname) ,如果另一条记录有两个父项,则 1 列将显示 null --like this 父母人数有上限吗? 【参考方案1】:

通常这类问题可以通过分层查询(使用CONNECT BY)来解决,但是在Oracle 中,查询不能有可变数量的列。作为一种解决方法,您可以使用 sys_connect_by_path 使用一些分隔符连接所有级别:

select sys_connect_by_path(Ledgergroupname, '/')
  from Acc_Ledgergroup
 where Ledgergroupname = 'root'
 start with Ledgercode in ('01003024007', '01003024019')
 connect by prior Ledgercode = Ledgergroupcode

【讨论】:

以上是关于oracle sql中的动态列的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle 中使用 sql 动态更改列标题

在 Oracle SQL 中生成动态列值

如何在 Oracle SQL 语句中重用动态列?

用于列的 Oracle 动态 SQL

使用动态列 Oracle SQL 查询的数据

如何用oracle动态查询一张表里面的某些列?