2016-10-21 1 views
0

Iは次のようになり、使用可能な最初の行を更新することができ、特定のカラムがNULLである場合、私は、最初に使用可能な行を更新するトラブルを抱えていると別の列が2複数の条件で使用可能な最初の行を更新

ID  UserID Model 
1  124  2 
2  125  1 
3  126  1 
4  NULL  3 
5  NULL  2 
5  NULL  2 

ありますIDは4でUserIDはありますが、 `AND Model = '2'のような追加条件を追加すると、クエリは0行を返します。

これは私が作ったクエリがあると使用しようとしています:

UPDATE Table SET UserID = '127' 
WHERE UserID IS NULL AND Model = '2' 
AND ID IN (SELECT top 1 ID FROM Table where UserID IS NULL) /*Update only 1 row 

、私はそれがまだ使用可能な最初の行を更新AND Model = '2'を削除した場合、私は非常に大きなテーブルで働いていると指定したいですモデルが2の場合でも更新するだけです。あなたは結果セットの最初のレコードを決定するために、ウィンドウ関数を使用して、ちょうど最初のエントリを更新することができ

+0

レコードはあなたが更新しようとしていますか?モデルが「2」の最初のIDを更新しようとしていますか? – Siyual

+0

@ Siyualモデル列に値2がある場合にのみUserID列を更新しようとしていますが、それらの条件を満たすものの代わりに1つの行だけが更新されることが重要です。 – Brayn

+0

なぜ制限を使用しないのですか? UPDATEテーブルSET UserID = '127' どこUserIDがNULLであり、モデル= '2'制限1; – Mannu

答えて

1

TOPを追加(1)あなたの基準に

更新中

例:

UPDATE Table SET UserID = '127' 
WHERE UserID IS NULL AND Model = '2' 
AND ID = (select top(1) id from category WHERE UserID IS NULL AND Model = '2') 
+0

2番目の 'AND Model =' 2 ''がSELECTにありませんでした。ありがとう – Brayn

+0

助けてくれてありがとう –

+0

これは正しいです。少なくともORDER BYが必要です。そうでなければ 'TOP 1'はランダムになります –

2

Sql Fiddle

WITH cte as (
    SELECT * 
      , row_number() over (partition by [UserID] order by [ID]) as rn 
    FROM Table1 
    WHERE Model = 2 
     AND UserID IS NULL 
) 
UPDATE cte 
SET [UserID] = 'Updated' 
WHERE rn =1; 

SELECT * 
FROM Table1 

OUTPUT

enter image description here

2

;With ToUpdate As 
(
    Select *, 
      Row_Number() Over (Partition By Model Order By Id) As RN 
    From Table 
    Where UserId Is Null 
) 
Update ToUpdate 
Set  UserId = 127 
Where Model = 2 
And  RN = 1 
関連する問題