63

列に値がない行に、行InterfaceID (INT)ごとに一意の値を入力しようとしています。

私はこのクエリを実行しようとしています:

UPDATE prices SET interfaceID = (SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices) 
       WHERE interfaceID IS null

がすべての行に対して評価されることを期待していました(SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices)が、それは1回だけ行われるため、影響を受けるすべての行が異なる値ではなく同じ値を取得しています。

これは単一のクエリで実行できますか?

4

8 に答える 8

108
declare @i int  = (SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices)


update prices
set interfaceID  = @i , @i = @i + 1
where interfaceID is null

仕事をする必要があります

于 2012-11-29T15:57:12.553 に答える
22
DECLARE @IncrementValue int
SET @IncrementValue = 0 
UPDATE Samples SET qty = @IncrementValue,@IncrementValue=@IncrementValue+1
于 2016-03-03T10:31:13.303 に答える
9

簡単なクエリは、変数を必要な数に設定するだけです。次に、その数から1を増やして、必要な列を更新します。すべての行について、1をインクリメントして各行IDを更新します

SET @a  = 50000835 ;  
UPDATE `civicrm_contact` SET external_identifier = @a:=@a+1 
WHERE external_identifier IS NULL;
于 2015-01-14T12:26:54.987 に答える
4

Postgresの場合

ALTER TABLE table_name ADD field_name serial PRIMARY KEY

参照:https ://www.tutorialspoint.com/postgresql/postgresql_using_autoincrement.htm

于 2017-01-26T09:55:34.320 に答える
3

このテーブルの主キーがあると仮定すると(持っている必要があります)、CTEまたはWITHを使用するだけでなく、同じテーブルへの自己結合を使用して更新を使用することもできます。

UPDATE a
SET a.interfaceId = b.sequence
FROM prices a
INNER JOIN
(
   SELECT ROW_NUMBER() OVER ( ORDER BY b.priceId ) + ( SELECT MAX( interfaceId ) + 1 FROM prices ) AS sequence, b.priceId
   FROM prices b
   WHERE b.interfaceId IS NULL
) b ON b.priceId = a.priceId

主キーはprice-idであると想定しました。

派生テーブルのエイリアスbは、主キー列とともにROW_NUMBER()関数を介してシーケンスを生成するために使用されます。列interface-idがNULLである行ごとに、これにより、主キー値とともに一意のシーケンス値を持つ行が生成されます。

主キーではなく、他の順序でシーケンスを並べ替えることができます。

シーケンスは、サブクエリを介して現在のMAXインターフェイスID+1によってオフセットされます。MAX()関数はNULL値を無視します。

WHERE句は、更新をNULLの行に制限します。

次に、派生テーブルは同じテーブル、エイリアスaに結合され、主キー列で結合され、更新される列が生成されたシーケンスに設定されます。

于 2017-11-14T12:28:06.370 に答える
2

オラクルベースの製品では、次のステートメントを使用できます。

update table set interfaceID=RowNum where condition;
于 2015-11-22T08:32:54.633 に答える
1

次のようなものを試してください。

with toupdate as (
    select p.*,
           (coalesce(max(interfaceid) over (), 0) +
            row_number() over (order by (select NULL))
           ) as newInterfaceId
    from prices
   )
update p
    set interfaceId = newInterfaceId
    where interfaceId is NULL

これはそれらを完全に連続させるわけではありませんが、新しいより高いIDを割り当てます。それらを連続させるには、次のことを試してください。

with toupdate as (
    select p.*,
           (coalesce(max(interfaceid) over (), 0) +
            row_number() over (partition by interfaceId order by (select NULL))
           ) as newInterfaceId
    from prices
   )
update p
    set interfaceId = newInterfaceId
    where interfaceId is NULL
于 2012-11-29T16:00:27.470 に答える
-1

あなたが試すことができます :

DECLARE @counter int
SET @counter = 0
UPDATE [table]
SET [column] = @counter, @counter = @counter + 1```
于 2020-02-27T09:57:40.380 に答える