3

次のSQLステートメントを使用して、#tempSybase15データベースの最新のパッケージバージョン番号で一時テーブルを更新します。

UPDATE t
SET versionId = l.latestVersion
FROM #temp t INNER JOIN (SELECT gp.packageId
                                , MAX(gp.versionId) latestVersion
                         FROM Group_Packages gp 
                         WHERE gp.groupId IN (SELECT groupId 
                                              FROM User_Group 
                                              WHERE userXpId = 'someUser')
                         GROUP BY gp.packageId) l
ON t.packageId = l.packageId

私にとって(主にOracleとSQL ServerはSybaseよりも経験が豊富です)、このステートメントにはほとんど問題がありません。ただし、Sybaseは例外をスローします。

You cannot use a derived table in the FROM clause of an UPDATE or DELETE statement.

今、私はここで何が問題なのかわかりません。これは、aggregation /GROUPBYが使用されているためだと思います。もちろん、サブクエリを一時テーブルに入れて結合することもできますが、「正しい」メソッドがどうあるべきか、そして何が間違っているのかを本当に知りたいのです。

任意のアイデアやガイダンスをいただければ幸いです。

4

4 に答える 4

3

SYBASEは、UPDATEFROMクラスのネストされたクエリをサポートしていないようです。同様の問題

これを使用してみてください:

UPDATE #temp
SET versionId =  (SELECT MAX(gp.versionId) latestVersion
                         FROM Group_Packages gp 
                         WHERE gp.packageId=#temp.packageId
                                and
                               gp.groupId IN (SELECT groupId 
                                              FROM User_Group 
                                              WHERE userXpId = 'someUser')

                         )

また、l.latestVersionがNULLの場合はどうなりますか?#tempをnullで更新しますか?そうでない場合は、WHEREを追加します。

    WHERE (SELECT MAX(gp.versionId)
                          ....
                                 ) is not null
于 2012-08-09T13:28:22.993 に答える
0

#tempのテーブルエイリアスは「t」と呼ばれ、元のテーブルは「t」と呼ばれます。

私の推測では、これが問題だと思います。

私はあなたが始めたいと思います:

update #temp
于 2012-08-09T13:10:35.450 に答える
0

FROMこれは、の句でのSybaseの制限(派生テーブルを許可しない)だと思いますUPDATE。おそらく、次のように書き直すことができます。

UPDATE t
SET t.versionId = l.versionId
FROM #temp t
  INNER JOIN 
    Group_Packages l
      ON t.packageId = l.packageId
WHERE
    l.groupId IN ( SELECT groupId 
                   FROM User_Group 
                   WHERE userXpId = 'someUser')
  AND
    l.versionId =
        ( SELECT MAX(gp.versionId)
          FROM Group_Packages gp 
          WHERE gp.groupId IN ( SELECT groupId 
                                FROM User_Group 
                                WHERE userXpId = 'someUser')
            AND gp.packageId = l.packageId
        ) ;
于 2012-08-09T13:26:46.793 に答える
0

この構文はSybaseで機能しますか?

update dstTable T
set (T.field1, T.field2, T.field3) = 
       (select S.value1, S.value2, S.value3
        from srcTable S
         where S.key = T.Key);

相関サブクエリは、必要に応じて複雑にすることができると思います(CTEの使用などを含む)。正しい数(およびタイプ)の値を投影する必要があります。

于 2022-02-10T01:37:44.767 に答える