1

作成しているアプリで複数のデータベースをサポートしようとしています。このアプリは主にHibernateを使用しますが、DMLステートメントがほんのわずかな時間で処理できる場合、数百万を超える行を繰り返し処理して個別に処理するのは非常に非効率的です。したがって、特定の操作では、SQLを作成する必要があります。私はMySQLの人間ですが、これまでのところ、SQLServerとMySQLで動作するアプリを持っています。私を困惑させた操作が1つあり、Oracleの更新クエリの一部を作成する方法がわからないようです。オラクルに関する限り、これはおそらく初心者の質問であることを私は知っていますが、私が探していたとき、私は明白な答えを逃したに違いありません。

MySQL用にこのタイプのクエリを作成する方法は次のとおりです。

table1 t1、table2 t2 set t1.colA = t2.colAを更新します。ここで、t1.colB=t2.colBおよびt1.colC=t2.colCです。

MySQLには、エイリアスを使用して'set'ステートメントの前にすべてのテーブルを指定できる優れた構造があります。これにより、ステートメントの残りの部分が大幅に簡素化されます。SQL Serverでは、update...joinを使用して同じことを行います。

Oracleでは、'update table1 set colA =(select ....)where presents(select ....)構文を使用しようとしましたが、これは機能しません-'サブクエリは複数の行を返します' エラー。また、構文で... using ...を使用してマージを使用しようとしましたが、「ソーステーブルから安定した行のセットを取得できません」というエラーが発生します。

私が達成しようとしていることをさらに説明するために、実行するクエリがいくつかあります。そのうちのいくつかは2つのテーブルを使用し、いくつかは3つのテーブルを使用します。最も複雑なものはこれを行う必要があります:

tableA.colBをtableC.colCの値で更新します。ここで、一致するすべての行についてtableA.colA=tableB.colAおよびtableB.colB=tableC.colBです。データの観点から、これは次のようになります(前と後):

Before:

Table A
-------
colA     colB
1        NULL
2        NULL
3        NULL
4        NULL

Table B
-------
colA     colB
1        A
2        A
3        B
4        B

Table C
-------
colB     colC
A        15
B        20

After:

Table A
-------
colA     colB
1        15
2        15
3        20
4        20

これが十分に明確であることを願っています。Oracle用にこの種のDMLクエリを作成する方法を誰かが説明できますか?ボーナスポイントについては、PostgreSQLでも同じですか?:)

4

3 に答える 3

2

distinct同じ値の複数のコピーを無視するために使用できます。

update  TableA
set     ColB = 
        (
        select  distinct ColC
        from    TableC C
        join    TableB B
        on      C.ColB = B.ColB
        where   B.ColA = TableA.ColA
        )

適切な値が複数見つかった場合でも、エラーが発生します。

于 2010-09-30T10:48:56.010 に答える
2

    SQL> select * from A
      2  /

          COLA       COLC
    ---------- ----------
             1
             2
             3
             4

    SQL> select * from B
      2  /

          COLA C
    ---------- -
             1 A
             2 A
             3 B
             4 B

    SQL> select * from C
      2  /

    C       COLC
    - ----------
    A         15
    B         20

    SQL>

クエリ

    SQL> update A
      2  set colc = ( select c.colc
      3               from c
      4                      join b on ( c.colB = b.colB )
      5               where
      6                  b.colA = A.colA )
      7  where exists
      8      ( select null
      9               from c
     10                      join b on ( c.colB = b.colB )
     11               where
     12                  b.colA = A.colA )
     13  /

    4 rows updated.

    SQL>

    SQL> select * from A
      2  /

          COLA       COLC
    ---------- ----------
             1         15
             2         15
             3         20
             4         20

    SQL>

明らかに、テストケースで何かを単純化したので、実際の状況を表すものではありません。重要なのは、サブクエリがA.colAの値ごとに1つの行を返すため、私のクエリが機能することです。データを再確認し、必要な基準を確立する必要があります。これはデータ/ビジネスロジックの問題であり、構文の問題ではありません。

于 2010-09-30T11:01:51.280 に答える
0

次のことを試してください。

UPDATE table_a a
  SET col_b = (SELECT col_c
                 FROM table_b b,
                      table_c c
                 WHERE b.col_a = a.col_a AND
                       c.col_b = b.col_b);

私はたまたまこのマシンにPostgresqlを持っていないので、それについてコメントすることはできません。

共有してお楽しみください。

于 2010-09-30T11:05:14.593 に答える