2012-05-24 123 views
0

我有两个表子查询返回多个行

产品(ID,姓名,CCODE)

类别(CCODE,CatName) - 无主键

Insert Into ProductNew (DW_Prod_Id, ProdId, ProdName, CC, CName)

Select Dw_Prod_Id.Nextval, Id, Name, CCode,

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

From Product;

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

我得到上述错误,因为我的SubQuery返回多个行。 我想每一行的产品,从表中CatCode匹配类别表,这样我可以得到CatName,然后插入行到我的新表:)

回答

2

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

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

到产品最新;)

编辑:

但是,如果像@Gordon Linoff指出的那样,你有重复的CCode,这将不起作用。

如果你不希望在分类表的主键,添加至少一个唯一约束(你必须先清理DATAS)

ALTER TABLE Category ADD CONSTRAINT Unique_code UNIQUE(CCode); 

编辑2:

但正确的方法是:

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

+0

烨改变了我的表名,让我尝试了这一点;) –

1

您似乎在您的类别表中有dulicates;否则一个简单连接就足够了:

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 
+0

如果我要放在哪里rowid不在(从Filter_Id = 1的A3_Error_Event中选择Source_RowId);我得到一个错误 - SQL错误:ORA-00918:列模糊定义 –