sql >> Database teknologi >  >> RDS >> Oracle

Sådan får du data på alle niveauer ved hjælp af enkelt SQL-forespørgsel til materialestykliste

Brug en hierarkisk forespørgsel og filter til kun at få bladknuderne.

Oracle-opsætning :

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;
 

Forespørgsel :

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;

Output :

Forespørgsel 2 :

Hvis du vil have den samlede mængde langs stien, skal du bruge en korreleret underforespørgsel til at krydse hierarkiet i den modsatte retning:

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;

Output :

db<>fiddle her




  1. cx_Oracle:Hvordan itererer jeg over et resultatsæt?

  2. Brug et array i Laravel-opdateringsforespørgsel

  3. MySQL-forespørgselsfejl 1054

  4. Databaseskema forvirrende (indeks og begrænsninger)