プライマリキーがないテーブルがあります。プライマリキーなしで重複する行を更新する方法
name age sex
a 12 m
b 61 m
c 23 f
d 12 m
a 12 m
a 12 m
f 14 f
私はちょうど3つの同様の行 - 行-1、行-5、行-6を持っています。 行1と行6に影響を与えずに行5を更新したいとします。 Plsは、これを達成する方法を私を助けます。
プライマリキーがないテーブルがあります。プライマリキーなしで重複する行を更新する方法
name age sex
a 12 m
b 61 m
c 23 f
d 12 m
a 12 m
a 12 m
f 14 f
私はちょうど3つの同様の行 - 行-1、行-5、行-6を持っています。 行1と行6に影響を与えずに行5を更新したいとします。 Plsは、これを達成する方法を私を助けます。
SQLでROW_NUMBER関数を使用することはできません。この複製は何千ものレコードに分散される可能性があります。 ROW_NUMBERは、OVER句で行番号を取得するために使用され、そのようなデータの記憶域は非クラスタ化されているため、削除できません。 唯一のオプションは、IDまたは一意の列をテーブルに追加してから特殊なレコードを削除することです。新しいインデックスまたは新しい列を持つテーブルを必要としない場合は、テーブルからその列を削除できます。
実際の問題は、行番号がなく、同じ行を区別する方法がないことです。あなたのデータがまだ挿入されている順番になっていれば、あなたはこれまで単に運が良かっただけです。 SQL Serverは行の順序付けを保証せず、予告なしに順序をランダム化できます。順序を保持するために、ID列を表に追加することができます。
ALTER TABLE TableWithNoPrimaryKey
ADD RowNum int IDENTITY(1,1) PRIMARY KEY
希望する方法があります。しかし、それはお勧めしません。
;WITH cte AS
(
SELECT *, RowNum = ROW_NUMBER() OVER (ORDER BY GETDATE())
FROM [table]
)
UPDATE cte
SET age = age + 1
WHERE (RowNum = 5)
AND (name = 'a' AND age = 12 AND sex = 'm');
5を更新し、1または6を更新しないのはなぜですか?なぜ1または5または6を更新しないのですか? 1、5、6を区別するためにあなた自身の心で使用するいくつかの隠された論理がありますか?そうであれば、その解決法はおそらくその論理にあります。 –
私はこれに最も明らかな答えがあると思います:主キーを追加してください。 – GolfWolf
SQL Serverの各行に一意のIDを与えるrow_number()に依存することができます – Seshagiri