0

次のように見える3つのテーブル(単なる例)があります

Artifact 
Id Name     
1  abc
2  xyz
3  pqr
4  mno

Classification 
Id Artifact_Id Node_id 
c1 1             n3
c2 1             n4
c3 3             n5
c4 4             n3
c5 4             n2

taxonomy_Node
Id  Parent_id
n1  null
n2  n1
n3  n1
n4  n2
n5  n3

したがって、すべてのアーティファクトは多くの分類 (taxonomyNode で構成される階層、つまり多くのノード) を持つことができます。taxonomyNode に基づいて、そのノードまたはその子を含むアーティファクトのリストが必要です。taxonomy_node に属する分類がある場合、アーティファクトのリストを返そうとしています。また、任意のノードの親が ID として指定されている場合、子ノードを含むアーティファクトを返す必要があります。私はここで本当に明確ではありません。ご不明な点がございましたら、お知らせください。

select A.* from artifact A 
   inner join classification C 
    on A.id = C.ARTIFACT_ID
   inner join TAXONOMY_NODE T 
    on C.node_id=T.id
    where T.id = 5068
  START WITH T.ID = 5068
  CONNECT BY PRIOR T.ID = T.parent_id

たとえば、分類テーブル アーティファクト 4 には、ノード n2 と n3 を持つ 2 つのクラス c4 と c5 があります。したがって、ノード ID を n3 として指定すると、アーティファクト 4 とアーティファクト 1 (n3 が含まれているため) とアーティファクト 3 (n3 は n5 の親であるため) が返されます。同様に、ノード ID を n2 として指定すると、4 と 1 が返されます。

4

1 に答える 1

2
/*
with Artifact as (
select 1 id,  'abc' name from dual
union all select 2,  'xyz' from dual
union all select 3,  'pqr' from dual
union all select 4,  'mno' from dual
),
Classification as (
select 'c1' id, 1 Artifact_Id, 'n3' Node_id from dual
union all select 'c2', 1, 'n4' from dual
union all select 'c3', 3, 'n5' from dual
union all select 'c4', 4, 'n3' from dual
union all select 'c5', 4, 'n2' from dual
),
taxonomy_Node as (
select 'n1' id, null Parent_id from dual
union all select 'n2',  'n1' from dual
union all select 'n3',  'n1' from dual
union all select 'n4',  'n2' from dual
union all select 'n5',  'n3' from dual
)
*/
select a.* 
from classification c 
     join (select id from taxonomy_node start with id = 'n3' connect by nocycle prior id = parent_id) h
     on (c.node_id = h.id)
     join artifact a on (a.id = c.artifact_id);

クエリの問題は、Oracle が最初にすべての結合を行い、次に CONNECT BY を適用することです。

于 2014-10-21T20:05:57.757 に答える