【问题标题】:Oracle 12c Recursive query for Product , Category relationshipOracle 12c 递归查询产品、类别关系
【发布时间】:2021-03-12 11:34:26
【问题描述】:

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

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

    的类别
  2. 我需要步骤 1

    中与该类别相关的所有产品

解释: 产品 P1 在 C1、C2、C4 的类别中可用。所以,我会考虑这些类别的所有产品 类别 C2 包含 P1、P4 两个产品。

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

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

【问题讨论】:

    标签: oracle plsql oracle12c recursive-query connect-by


    【解决方案1】:

    你可以使用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>
    

    【讨论】:

      【解决方案2】:

      像下面这样的简单 SQL 查询应该可以完成这项工作,

      select * from products 
      where category in 
      (select category 
       from products 
       where product in 
      (select product 
      from products 
      where category in (
      (select category 
      from products 
      where product ='P1'))))
      

      输出:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多