0

列を持つ CATEGORY という名前のテーブルがあるとします。

  • 種別名
  • CATEGORY_PARENT_NAME
  • アクティブ

そして、このクエリ

SELECT *
FROM CATEGORY
WHERE ACTIVE = 'TRUE'
START WITH CATEGORY_PARENT_NAME IS NULL   
CONNECT BY CATEGORY_PARENT_NAME = PRIOR CATEGORY_NAME   
ORDER SIBLINGS BY MENU_INDEX

ルートの親がアクティブなアクティブな子ノードのみを取得しようとしていますが、親が where 句でフィルタリングされていても、オラクルは非アクティブなルートのアクティブな子ノードも返します。私は何か間違ったことをしていますか?

4

2 に答える 2

0

次のクエリ ( SQL Fiddleを参照) は、ルートがアクティブなすべてのアクティブノードを取得します。

SELECT *
FROM (
  SELECT c.*,
    PRIOR c.ACTIVE AS PARENT_ACTIVE,
    CONNECT_BY_ROOT(c.CATEGORY_NAME) AS CATEGORY_ROOT_NAME,
    CONNECT_BY_ROOT(c.ACTIVE) AS ROOT_ACTIVE
  FROM CATEGORY c
  WHERE c.ACTIVE = 'TRUE'
  START WITH c.CATEGORY_PARENT_NAME IS NULL   
  CONNECT BY c.CATEGORY_PARENT_NAME = PRIOR c.CATEGORY_NAME   
  ORDER SIBLINGS BY c.MENU_INDEX
) a
WHERE a.ROOT_ACTIVE = 'TRUE'

結果をさらにフィルター処理して、親、祖父母、および階層ルートまでのすべての先祖ノードがアクティブなアクティブ ノードのみを含めるには ( SQL Fiddleを参照):

SELECT *
FROM (
  SELECT c.*,
    PRIOR c.ACTIVE AS PARENT_ACTIVE,
    CONNECT_BY_ROOT(c.CATEGORY_NAME) AS CATEGORY_ROOT_NAME,
    CONNECT_BY_ROOT(c.ACTIVE) AS ROOT_ACTIVE,
    SYS_CONNECT_BY_PATH(c.ACTIVE, '/') AS ACTIVE_PATH
  FROM CATEGORY c
  WHERE c.ACTIVE = 'TRUE'
  START WITH c.CATEGORY_PARENT_NAME IS NULL   
  CONNECT BY c.CATEGORY_PARENT_NAME = PRIOR c.CATEGORY_NAME   
  ORDER SIBLINGS BY c.MENU_INDEX
) a
WHERE a.ROOT_ACTIVE = 'TRUE'
  AND a.ACTIVE_PATH NOT LIKE '%FALSE%'

チップ

  • 演算子を使用してCONNECT_BY_ROOT、ルート ノードから列の値を取得します。
  • 演算子を使用して、親ノードから列の値を取得します (ルート ノードにいるときは s にPRIOR注目してください)。NULL
  • この関数を使用SYS_CONNECT_BY_PATHして、ルート ノードまでの列の値を取得します。
于 2013-08-08T22:52:53.967 に答える