SubQuery返回多行

时间:2012-05-24 15:19:50

标签: sql oracle oracle10g oracle-sqldeveloper

我有两张桌子

产品(Id,Name,CCode)

类别(CCode,CatName) - 无主键

  

插入ProductNew(DW_Prod_Id,ProdId,ProdName,CC,CName)

     

选择Dw_Prod_Id.Nextval,Id,Name,CCode,

    (Select CatName
     From Category cc, Product p
     Where  cc.CCode IN p.CatCode
     Group By CatName ) 
     

来自产品;

SQL错误:ORA-01427:单行子查询返回多行 01427. 00000 - “单行子查询返回多行”

我收到上述错误因为我的SubQuery返回多行。 我想将Product表中每行的CatCode与Category Table相匹配,以便我可以获取CatName,然后将行插入到我的新表中:)

2 个答案:

答案 0 :(得分:1)

如果产品只能有一个类别:

INSERT INTO ProdcutNew (DW_Prod_Id, ProdId, ProdName, CC, CName)

(SELECT Dw_Prod_Id.Nextval, p.Id, p.Name, cc.CCode, cc.CName
FROM Product p
INNER JOIN Category cc on p.CatCode = cc.CCode)

您可以更正表格名称

  

ProdcutNew

到ProductNew;)

编辑:

但是,正如@Gordon Linoff指出的那样,你有重复的CCode,这将无效。

如果您不想在Category表上使用主键,请至少添加一个唯一约束(您必须先清理数据)

ALTER TABLE Category ADD CONSTRAINT Unique_code UNIQUE(CCode);

编辑2:

但正确的方法是:

在类别中添加ID作为PK,并在产品中将其用作Category_ID FK(如果CCode可以更改) 具有CCode的唯一约束。

答案 1 :(得分:0)

您的类别表中似乎有重复项;否则简单的连接就足够了:

select p.*, c.ccode
from Category c join
     Product p
     on c.ccode = p.catcode

要任意选择一个类别,请执行以下操作:

select p.*, c.ccode
from (select c.*
      from (select c.*, row_number() over (partition by c.ccode order by c.ccode) as seqnum
            from Category c
           ) c
       where seqnum = 1
      ) c join
     Product p
     on c.ccode = p.catcode