首页 > 解决方案 > Oracle 12c 递归查询产品、类别关系

问题描述

我有如下数据。如果我搜索产品“P1”然后

  1. 我需要所有具有产品“P1”的类别

  2. 我需要与步骤 1中的类别相关的所有产品

在此处输入图像描述

说明: 产品 P1 在 C1、C2、C4 的类别中有效。因此,我将考虑这些类别中的所有产品,类别 C2 包含两个产品,即 P1、P4。

所以,我也必须考虑类别 C3,因为产品 P4 在 C3 中可用。检查所有记录并获取数据的类似方法。

我可以使用 Cursor、存储过程和临时表中的循环来实现这一点。有没有办法通过查询来获取数据?

标签: oracleplsqloracle12crecursive-queryconnect-by

解决方案


您可以EXISTS按如下方式使用:

SQL> -- SAMPLE DATA
SQL> WITH YOUR_TABLE (CATEGORY, PRODUCT,AMOUNT) AS
  2  (SELECT 'C1','P1',5 FROM DUAL UNION ALL
  3  SELECT 'C1','P2',6 FROM DUAL UNION ALL
  4  SELECT 'C2','P4',5 FROM DUAL UNION ALL
  5  SELECT 'C2','P1',10 FROM DUAL UNION ALL
  6  SELECT 'C3','P4',20 FROM DUAL UNION ALL
  7  SELECT 'C3','P5',5 FROM DUAL UNION ALL
  8  SELECT 'C3','P3',10 FROM DUAL UNION ALL
  9  SELECT 'C4','P1',5 FROM DUAL UNION ALL
 10  SELECT 'C5','P7',5 FROM DUAL UNION ALL
 11  SELECT 'C5','P8',5 FROM DUAL UNION ALL
 12  SELECT 'C5','P9',5 FROM DUAL)
 13  -- YOUR QUERY STARTS FROM HERE
 14  SELECT *
 15    FROM YOUR_TABLE T
 16   WHERE T.PRODUCT = 'P1'
 17      OR EXISTS (
 18  SELECT 1
 19    FROM YOUR_TABLE   P1LVL1
 20    JOIN YOUR_TABLE   P1LVL2
 21  ON P1LVL2.PRODUCT = P1LVL1.PRODUCT
 22    JOIN YOUR_TABLE   P1LVL3
 23  ON P1LVL3.CATEGORY = P1LVL2.CATEGORY
 24     AND T.CATEGORY = P1LVL1.CATEGORY
 25     AND P1LVL3.PRODUCT = 'P1'
 26  )
 27   ORDER BY CATEGORY,
 28            PRODUCT;

CA PR     AMOUNT
-- -- ----------
C1 P1          5
C1 P2          6
C2 P1         10
C2 P4          5
C3 P3         10
C3 P4         20
C3 P5          5
C4 P1          5

8 rows selected.

SQL>

推荐阅读