37

SQL Select の列名にテーブル エイリアスを追加するフレームワーク (Jodd) を使用しています。これは整形式の SQL のように見えますが、Postgres はそれを詰まらせます。

update GREETING Greeting 
     set Greeting.ID=5, 
         Greeting.NAME='World', 
         Greeting.PHRASE='Hello World!'  
where (Greeting.ID=5)

エラーが発生します:

Error: ERROR: column "greeting" of relation "greeting" does not exist
SQLState:  42703

Postgres にその SQL を受け入れさせる方法はありますか? 私の他の選択肢は、私がしたくないフレームワークをハックすることです。

4

4 に答える 4

56

問題は、テーブルの別名 inSET句を列に含めることです。UPDATEPostgres docsのドキュメントを参照してください。

column

の列の名前table。列名は、必要に応じて、サブフィールド名または配列添字で修飾できます。ターゲット列の指定にテーブルの名前を含めないでください。たとえば、UPDATE tab SET tab.col = 1無効です。

これは Postgres で有効です:

update GREETING Greeting 
set 
    NAME='World', 
    PHRASE='Hello World!' 
where Greeting.ID=5 ;
于 2012-07-06T21:51:53.737 に答える
7

特に列UPDATE部分については、ステートメントのドキュメントを確認してください。句で列の前にテーブルエイリアスを付けることは違法です。 SET

UPDATE GREETING Greeting
   SET ID=5, NAME='World', PHRASE='Hello World!'
 WHERE (Greeting.ID=5);
于 2012-07-06T21:54:36.497 に答える
4

最新の Jodd v3.3.7 を使用してみてください。この問題が修正された場所。

問題は Jodd ライブラリにありました。エンティティ更新メソッドは、テーブル エイリアスを使用して更新ステートメントを生成していました。新しいバージョンは単にテーブルのエイリアスを配置しません。これは Postgres や他のデータベースでも機能します。

于 2012-07-27T23:07:10.973 に答える
0

他の人が言ったように、postgres では、更新されている列の名前にエイリアスを使用することは違法ですが、rhs 式でエイリアスを使用することが可能である (場合によっては必要になる) ことに注意してください。例えば:

CREATE TABLE greetings (name VARCHAR(20), phrase VARCHAR(100));
INSERT INTO greetings (name, phrase);
VALUES ('palindrome_1', 'Rise to vote sir'),
       ('palindrome_2', 'Race fast, safe car');

-- You can do something like this:
UPDATE greetings g SET phrase = REVERSE (g.phrase);
                                      -- ^
                                      -- |
                                      -- +--- this works

この例では、そのエイリアスは必要ないため、これは少しばかげています。これは、複数のテーブルが関係している場合により便利になります。

于 2020-08-08T09:52:53.627 に答える