0

私は2つのテーブルを持っています

製品 (ID、名前、CCode)

カテゴリ (CCode、CatName) - 主キーなし

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

Dw_Prod_Id.Nextval、ID、名前、CCode、

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

製品から;

SQL エラー: ORA-01427: 単一行のサブクエリが複数の行を返します 01427. 00000 - "単一行のサブクエリが複数の行を返します"

サブクエリが複数の行を返すため、上記のエラーが発生します。CatName を取得して新しいテーブルに行を挿入できるように、Product テーブルの各行の CatCode を Category テーブルに一致させたいと思います:)

4

2 に答える 2

1

製品が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が重複している場合、これは機能しません。

カテゴリテーブルに主キーが必要ない場合は、少なくとも一意の制約を追加します(最初にデータをクリーンアップする必要があります)

ALTER TABLE Category ADD CONSTRAINT Unique_code UNIQUE(CCode);

編集2:

しかし、適切な方法は次のとおりです。

カテゴリ内のIDをPKとして追加し、それを製品内の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

1 つのカテゴリを任意に選択するには、次のようにします。

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 に答える