首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >oracle嵌套select查询

问oracle嵌套select查询
EN

Stack Overflow用户
提问于 2013-02-05 05:59:11
回答 3查看 67.3K关注 0票数 5

我在oracle db上有一个表:

​

​

我是否可以执行嵌套select查询,将父列更改为与其关联的名称?如下所示:

​

​

我试过了:

代码语言:javascript
复制
SELECT PC.ID
,(
  SELECT PC.NAME from PRODUCTS_CATEGORIES PC where PC.PARENT = PC.ID
 )
 ,PC.NAME
  FROM PRODUCTS_CATEGORIES PC 

并得到了这个错误:

代码语言:javascript
复制
Error Message: ORA-01427: single-row sub query returns more than one row
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-05 06:10:56

你可以做到的

代码语言:javascript
复制
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 

或

代码语言:javascript
复制
 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
票数 5
EN

Stack Overflow用户

发布于 2013-02-05 06:57:28

代码语言:javascript
复制
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 (当您有一个外键约束时,这也是有效的)。

票数 2
EN

Stack Overflow用户

发布于 2013-02-05 06:06:10

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

代码语言:javascript
复制
SELECT PC.ID
,(
  SELECT PC2.NAME from PRODUCTS_CATEGORIES PC2 where PC.PARENT = PC2.ID
 )
 ,PC.NAME
  FROM PRODUCTS_CATEGORIES PC 

我很惊讶oracle可以解决连接问题,因为两个别名都是PC。除此之外,他不会说谎的计算机-有些产品有不止一个父母。

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

代码语言:javascript
复制
SELECT PC.ID
,(
  SELECT PC2.NAME from PRODUCTS_CATEGORIES PC2 where PC.PARENT = PC2.ID 
  AND ROWNUM <= 1
 )
 ,PC.NAME
  FROM PRODUCTS_CATEGORIES PC 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14696422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档