sql >> データベース >  >> RDS >> Oracle

部品表の単一のSQLクエリを使用してすべてのレベルのデータを取得する方法

    階層クエリとフィルターを使用して、リーフノードのみを取得します。

    Oracleセットアップ

    CREATE TABLE table_name ( bom_code, rm_code, qty ) AS
      SELECT 'A', 'B', 1 FROM DUAL UNION ALL
      SELECT 'A', 'C', 2 FROM DUAL UNION ALL
      SELECT 'A', 'D', 5 FROM DUAL UNION ALL
      SELECT 'A', 'E', 3 FROM DUAL UNION ALL
      SELECT 'A', 'F', 8 FROM DUAL UNION ALL
      SELECT 'D', 'G', 2 FROM DUAL UNION ALL
      SELECT 'D', 'H', 1 FROM DUAL UNION ALL
      SELECT 'D', 'I', 1 FROM DUAL UNION ALL
      SELECT 'D', 'J', 1 FROM DUAL UNION ALL
      SELECT 'F', 'K', 1 FROM DUAL UNION ALL
      SELECT 'F', 'L', 1 FROM DUAL UNION ALL
      SELECT 'G', 'Z', 1 FROM DUAL UNION ALL
      SELECT 'G', 'AA', 3 FROM DUAL UNION ALL
      SELECT 'I', 'M', 4 FROM DUAL UNION ALL
      SELECT 'I', 'N', 9 FROM DUAL UNION ALL
      SELECT 'I', 'O', 7 FROM DUAL UNION ALL
      SELECT 'N', 'P', 6 FROM DUAL UNION ALL
      SELECT 'N', 'Q', 12 FROM DUAL UNION ALL
      SELECT 'N', 'R', 4 FROM DUAL UNION ALL
      SELECT 'N', 'S', 9 FROM DUAL UNION ALL
      SELECT 'S', 'T', 3 FROM DUAL UNION ALL
      SELECT 'S', 'U', 2 FROM DUAL UNION ALL
      SELECT 'T', 'V', 1 FROM DUAL UNION ALL
      SELECT 'T', 'W', 3 FROM DUAL UNION ALL
      SELECT 'U', 'X', 5 FROM DUAL UNION ALL
      SELECT 'U', 'Y', 8 FROM DUAL;
    

    クエリ

    SELECT t.*,
           SYS_CONNECT_BY_PATH( BOM_CODE, '-' ) || '-' || RM_CODE AS path,
           LEVEL
    FROM   table_name t
    WHERE  CONNECT_BY_ISLEAF = 1
    START WITH bom_code = 'A'
    CONNECT BY PRIOR rm_code = bom_code;
    

    出力

    クエリ2

    パスに沿った合計数量が必要な場合は、相関サブクエリを使用して、階層を逆方向にトラバースします。

    SELECT t.*,
           SYS_CONNECT_BY_PATH( BOM_CODE, '-' ) || '-' || RM_CODE AS path,
           LEVEL,
           ( SELECT SUM( qty )
             FROM   table_name s
             START WITH t.rm_code = s.rm_code
             CONNECT BY PRIOR bom_code = rm_code ) AS total_qty
    FROM   table_name t
    WHERE  CONNECT_BY_ISLEAF = 1
    START WITH bom_code = 'A'
    CONNECT BY PRIOR rm_code = bom_code;
    

    出力

    db <> fiddle こちら




    1. データベース接続情報を保存する方法は安全ですか?

    2. Oracleテーブルにデータを挿入する最速の方法は何ですか?

    3. Laravel 4:存在しない場所

    4. PHPとMySQLを使用して単一のチェックボックスを検証する方法