0

Oracle DB で次のクエリを使用しました。

UPDATE test5_rdf_memoization 
SET object ='galib' 
WHERE ( predicate='platform' AND 
    object IS NULL AND 
    subject IN ( SELECT subject 
                FROM test5_rdf_memoization t1, 
                    test_parameters_new_5 t2, 
                    test_parameter_detail t3 
                WHERE (t1.object = t2.id AND 
                    t2.id = t3.parameter AND 
                    t1.predicate = 'parameter' AND 
                    t3.host_tool_detail = 1 AND 
                    (t1.subject >= 624))  
                order by t1.subject) );

しかし、それは私に次のエラーを与えています

 Error starting at line 1 in command: 
    UPDATE test5_rdf_memoization SET
     object ='galib' WHERE ( predicate='platform' AND object IS NULL AND
     subject IN ( SELECT subject FROM test5_rdf_memoization t1,
     test_parameters_new_5 t2, test_parameter_detail t3 WHERE (t1.object =
     t2.id AND t2.id = t3.parameter AND t1.predicate = 'parameter' AND
     t3.host_tool_detail = 1 AND (t1.subject >= 624))  order by t1.subject)
     ) 
 Error at Command Line:2 Column:10 Error report: SQL Error:
 ORA-00907: missing right parenthesis
 00907. 00000 -  "missing right parenthesis"
 *Cause:    
 *Action:

括弧のさまざまな組み合わせを試しましたが、うまくいきません。誰でもこれで私を助けてもらえますか?

4

2 に答える 2

1

これを試してみてください - あなたのINステートメントの周りに一組の括弧が必要なだけです。ORDER BY次のステートメントも削除しました。

UPDATE test5_rdf_memoization 
SET object ='galib' 
WHERE predicate='platform' 
   AND object IS NULL 
   AND subject IN ( 
       SELECT subject 
       FROM test5_rdf_memoization t1, 
            test_parameters_new_5 t2, 
            test_parameter_detail t3 
       WHERE t1.object = t2.id 
            AND t2.id = t3.parameter 
            AND t1.predicate = 'parameter' 
            AND t3.host_tool_detail = 1 
            AND t1.subject >= 624)

私は使用することを好みINNER JOINsます:

UPDATE test5_rdf_memoization 
SET object ='galib' 
WHERE predicate='platform' 
   AND object IS NULL 
   AND subject IN ( 
       SELECT subject 
       FROM test5_rdf_memoization t1 
           INNER JOIN test_parameters_new_5 t2 
               ON t1.object = t2.id 
           INNER JOIN test_parameter_detail t3 
               ON t2.id = t3.parameter 
       WHERE t1.predicate = 'parameter' 
            AND t3.host_tool_detail = 1 
            AND t1.subject >= 624)
于 2013-03-29T01:59:41.950 に答える
1

Oracle は、多くの場合、構文エラーを示すためにスローORA-00907: missing right parenthesisします。これは、通常、一致するブラケットが見つかる前に不正な句が見つかったためです。

この場合、それはORDER BY条項に反対しています。そのようなサブクエリを注文することはできません。実際、ステートメントは単にレコードの存在をテストしているだけなので、並べ替えは問題ではありません。したがって、最初にランダムにレコードを見つけるか、英数字の 3 番目に並べ替えるかを誰が気にしますか? 明らかに、並べ替えは CPU サイクルを消費するため、不要な並べ替えはパフォーマンスの観点からは良くありませんが、結果は変わりません。

「主題ごとに分類されたデータが必要です。」

いいえ、ありません。test5_rdf_memoization特定の基準セットに一致するすべてのレコードを同じ値に更新してい ます。繰り返しますが、結果が同じであるため、それらが更新される順序は重要ではありません。


この説明に満足できない場合は、質問を編集してビジネス要件を説明してください。これにより、機能するソリューションを提供できます。

于 2013-03-29T09:55:16.113 に答える