【问题标题】:oracle nested select queryoracle 嵌套选择查询
【发布时间】:2013-01-19 17:22:40
【问题描述】:

我在 oracle db 上有这张表:

我可以执行嵌套选择查询,将 PARENT 列更改为与其关联的名称吗? 像这样:

我试过了:

SELECT PC.ID
,(
  SELECT PC.NAME from PRODUCTS_CATEGORIES PC where PC.PARENT = PC.ID
 )
 ,PC.NAME
  FROM PRODUCTS_CATEGORIES PC 

得到了这个错误:

Error Message: ORA-01427: single-row sub query returns more than one row

【问题讨论】:

    标签: sql database select oracle11g


    【解决方案1】:

    你可以这样做

    SELECT PC.ID,
    (
       SELECT DISTINCT PC2.NAME from PRODUCTS_CATEGORIES PC2 
       where PC.PARENT = PC2.ID AND PC2.PARENT = 0
     ),
     PC.NAME
     FROM PRODUCTS_CATEGORIES PC 
    

     SELECT PC.ID,NVL(PC2.NAME,PC.PARENT) PC2_NAME,PC.NAME
      FROM PRODUCTS_CATEGORIES PC 
      LEFT OUTER JOIN 
      (SELECT DISTINCT ID, NAME 
      from PRODUCTS_CATEGORIES WHERE PARENT = 0) PC2 ON PC.PARENT = PC2.ID
    

    【讨论】:

    • A distinct 不保证只返回一行。
    • @a_horse_with_no_name,我认为同一个父 ID 不会有多个名称。
    • @rs:那么 distinct 就没用了。
    • @a_horse_with_no_name 不一定正确。可能有多行具有相同的名称 - 在这种情况下,DISTINCT 是必要的。
    【解决方案2】:
    select pc.id,
           coalesce(pr.name, 'No Parent') as parent_name,
           pc.name
    from products_categories pc
      left join products_categories pr on pc.parent = pr.id;
    

    请注意,将0 存储为父级并不是一个好主意。这表明您可能没有在 parent 列上定义外键约束 - 您应该这样做。要表明没有父级存在,最好使用NULL(当您确实有外键约束时也可以使用)。

    【讨论】:

      【解决方案3】:

      将子查询中的别名更改为PC2 至少会使查询在逻辑上更易于阅读。

      SELECT PC.ID
      ,(
        SELECT PC2.NAME from PRODUCTS_CATEGORIES PC2 where PC.PARENT = PC2.ID
       )
       ,PC.NAME
        FROM PRODUCTS_CATEGORIES PC 
      

      我很惊讶 oracle 可以计算出连接,因为两个别名都是 PC。除了他不撒谎之外-有些产品有不止一个父母。

      如果你不介意,你可以选择第一个父母(如果这确实是问题):

      SELECT PC.ID
      ,(
        SELECT PC2.NAME from PRODUCTS_CATEGORIES PC2 where PC.PARENT = PC2.ID 
        AND ROWNUM <= 1
       )
       ,PC.NAME
        FROM PRODUCTS_CATEGORIES PC 
      

      【讨论】:

      • oracle 不支持TOP
      猜你喜欢
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 2017-05-06
      • 2018-05-08
      • 1970-01-01
      • 2022-11-03
      • 2013-07-28
      • 1970-01-01
      相关资源
      最近更新 更多