我有两张桌子
产品(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,然后将行插入到我的新表中:)
答案 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