0

我有两张桌子

产品(ID、名称、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 -“单行子查询返回多于一行”

我收到上述错误因为我的子查询返回不止一行。我想将 Product 表中每一行的 CatCode 与 Category 表匹配,以便我可以获得 CatName,然后将行插入到我的新表中:)

4

2 回答 2

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)

你可以更正你的表名

产品新品

到 ProductNew ;)

编辑 :

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

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

ALTER TABLE Category ADD CONSTRAINT Unique_code UNIQUE(CCode);

编辑 2:

但正确的方法是:

将 Category 中的 Id 添加为 PK,并将其用作 Product 中的 Category_ID FK(如果 CCode 可以更改),并具有对 CCode 的唯一约束。

于 2012-05-24T15:26:05.660 回答
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
于 2012-05-24T15:28:23.903 回答