2016-03-20 3 views
0

私は場所のリストを持っています。私はゲストブックにそれぞれのノートを挿入する必要があります。サブクエリをOracleの単一値に変換する

は、私は、次のコードを持っている:

begin 
    for rec in (
    SELECT p.place_id FROM Places p 
    WHERE p.place_id NOT IN(
      SELECT DISTINCT v.place_id FROM Visits v 
     ) 
) loop 
    INSERT INTO Guestbook 
    VALUES (
     rec.place_id, 
     (
      SELECT MAX(person_id) INTO my_id 
      FROM Persons 
      WHERE name LIKE 'My Name' 
      GROUP BY person_id; 
    ), 
     'My comment' 
); 
    end loop; 
end; 

問題は、それが列としてサブクエリを見ているので、挿入は、動作しないということです。しかし、MAX()を呼び出そうとしても、それを単一の値として見ることはできません。私はサブクエリがちょうど1つの値を返すようにすることを必要とするので、私はゲストブック

答えて

0

に挿入することができますあなたはいつもあなたが取得している完全なエラーメッセージを含める必要があります - このケースでは、あなたはこの部分でいくつかのエラーを持っています:

SELECT MAX(person_id) INTO my_id 
     FROM Persons 
     WHERE name LIKE 'My Name' 
     GROUP BY person_id; 
  • セミコロン ';' SQL文の終わりをマーク - あなたの文が次の行に続けているので、あなたがPL/SQL変数にSQL文の結果を保存したい場合は、それ
  • INTO my_idが必要で削除する必要があります。それはより複雑なステートメントの一部なので、ここでは意味をなさないので削除する必要があります。
  • GROUP BY person_idと一緒MAX(person_id)を使用しても意味がありません。

    INSERT INTO Guestbook(place_id, person_id, comment) 
    SELECT 
        p.place_id, 
        (
         SELECT MAX(person_id) 
         FROM Persons 
         WHERE name LIKE 'My Name' 
         GROUP BY name 
    ), 
        'My comment' 
    FROM Places p 
    WHERE p.place_id NOT IN (
        SELECT v.place_id FROM Visits v 
    ); 
    

    これは短いです:私はあなたが教育目的のためにループとしてそれを書きたい場合を除き、これは(とすべきである)、単純なINSERT文のように書き換えることができ、あなたが最後にGROUP BY name

をしたいと仮定します、より明確でより効率的です。また、INTO節の列を明示的に列挙しました。これにより、将来、列がターゲット表に追加された場合でもコードが確実に機能します。

1

このようなことを試しましたか?

SELECT (SELECT MAX(person_id) FROM Persons) INTO my_id 
     FROM Persons 
     WHERE name LIKE 'My Name' 
     GROUP BY person_id; 
関連する問題