我在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
答案 0 :(得分: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
(当你有外键约束时也可以这样做。)
答案 1 :(得分: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
OR
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
答案 2 :(得分:0)
将子查询中的别名更改为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