2012-05-24 119 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:列模糊定義 –