3

以前は機能していたOracle10SQLの階層クエリがあります。しかし、それが基づいていたマテリアライズド・ビューを削除したため、そのビューを完全に除外しても、正しく表示されなくなりました。

元のクエリは次のようになりました。

select oh.name, oh.description
  , sys_connect_by_path(groupname, ':') "Groups"
  , (select count(*) 
      from ml.lastobsmv 
      where lastobsmv.hdid = oh.hdid) as obscount
from ml.obshead oh
  join ml.hiergrps hg on oh.groupid = hg.groupid
    connect by prior hg.groupid = hg.parentid

それでも機能すると思いますが、lastobsmvビューがないと、テストできません。

私がそれを切り詰めれば

select oh.name, oh.description
from  ml.obshead oh
  join ml.hiergrps hg on oh.groupid = hg.groupid

それでも機能し、41Kレコードを返します。ただし、connect by句を使用すると、制御不能になり、数百万のレコードが返されます(通常、正確なカウントを取得する前にキャンセルする必要があります)。

select oh.name, oh.description
  , sys_connect_by_path(groupname, ':') "Groups"
from ml.obshead oh
  join ml.hiergrps hg on oh.groupid = hg.groupid
    connect by prior hg.groupid = hg.parentid

私はここで本当に露骨な何かを見逃していますか、それともこれが機能するはずの方法を誤解していますか?ありがとう。


ヴァディム、

観察用語のリストとそれらが属するグループを返す必要があります。たとえば、

オブスヘッド:

# CYCLE DAYS, number of days in menstrual cycle, 100

HierGrps:

100, 50, Gynecology
50, 10, Tx
10, 0, Basic

生成する必要があります

# CYCLE DAYS, number of days in menstrual cycle, :Basic:Tx:Gynecology

(最終的には、このobs用語が使用された回数とともに、後で心配します)。

4

4 に答える 4

3
select
    oh.name,
    oh.description,
    hg."Groups"
from
    obshead oh
    join ( select
               groupid,
               sys_connect_by_path( groupname, ':' ) "Groups"
           from
               hiergrps
           start with
               parentid = 0
           connect by
               prior groupid = parentid
         ) hg
      on oh.groupid = hg.groupid

クエリのテストに使用したサンプルデータは次のとおりです。

create table obshead
( name varchar2(30)
, description varchar2(30)
, groupid number(3)
);
insert into obshead ( name, description, groupid )
     select 'Name One', 'Description One', 100 from dual union all
     select 'Name Two', 'Description Two', 200 from dual
;

create table hiergrps
( groupid number(3)
, parentid number(3)
, groupname varchar2(30)
);
insert into hiergrps ( groupid, parentid, groupname )
     select 100, 50, 'Gynecology' from dual union all
     select  50, 10, 'Tx'         from dual union all
     select  10,  0, 'Basic'      from dual
;
于 2010-01-26T20:14:58.463 に答える
2

元のクエリがどのように機能するかはわかりませんが、これが私が機能するための最良のソリューションです...

ただし、戻りGynecology:Tx:Basicます(逆順)。

SELECT
  oh.name,
  oh.description,
  ( SELECT SYS_CONNECT_BY_PATH(groupname, ':')
    FROM hiergrps hg
    WHERE CONNECT_BY_ISLEAF = 1
      START WITH hg.groupid = oh.groupid
      CONNECT BY PRIOR hg.parentid = hg.groupid
  ) "groups"
FROM obshead oh

本当に使ったのかprior hg.groupid = hg.parentid、使わなかったのprior hg.parentid = hg.groupid
私はあなたのテストデータを誤解しているかもしれませんが、私は最初に始めてからgroupid=100, parentid=50取得する必要があるようgroupid=50 parentid=10です?

于 2010-01-26T20:11:01.087 に答える
2

JOINは接続前に評価されるようであるため、1つの行で階層を構築することはできません。サブクエリを使用すると、必要なものを取得できます。

SQL> SELECT oh.NAME, oh.description, 
  2         MAX(groups) keep(dense_rank LAST ORDER BY lvl) groups
  3    FROM obshead oh
  4    JOIN (SELECT sys_connect_by_path(groupname, ':') Groups, 
  5                 hg.groupid, hg.parentid, LEVEL lvl
  6            FROM hiergrps hg
  7          CONNECT BY PRIOR hg.groupid = hg.parentid) hg 
  8      ON oh.groupid = hg.groupid
  9   GROUP BY oh.NAME, oh.description;

NAME         DESCRIPTION                       GROUPS
------------ --------------------------------- ---------------------------
# CYCLE DAYS number of days in menstrual cycle :Basic:Tx:Gynecology
于 2010-01-26T20:18:28.097 に答える
1

Peterの方がエレガントに見えますが、テーブルとデータについて次の仮定を前提として、これが私が思いついたものです。

create table obshead
(
cycledays number,
numdaysincycle number,
groupid number
);

create table hiergrps 
(
groupid number,
parent number,
groupname varchar2(40)
);


insert into obshead select 100 cycledays, 30 numdaysincycle, 100 groupid from dual;
insert into hiergrps select 100 groupid, 50 parent, 'Gyncecology' groupname from dual;
insert into hiergrps select 50 groupid, 10 parent, 'Tx' groupname from dual;
insert into hiergrps select 10 groupid, 0 parent, 'Basic' groupname from dual;

select cycledays,
       numdaysincycle,
       groups
  from (select groupid,
               parent,
               sys_connect_by_path(groupname, ':') groups
          from hiergrps hg 
        start with parent = 0
        connect by prior hg.groupid = hg.parent
       ) hg,
       obshead obs
 where obs.groupid = hg.groupid;

これは私に戻ります:

100 30  :Basic:Tx:Gyncecology

編集:Vadimを組み込むためにselectを更新しましたparentid = 0

于 2010-01-26T20:15:43.323 に答える