2017-03-01 8 views
2

です。以下の表のような表があります。IDのないクエリのSQL更新ステートメントIDは

second_idがないすべての行(second_id = 0)を更新する必要があります。

しかし、Statusが0でsecond_idが0のすべての行だけが、次にsecond_idでRecordの最後の行から最後のsecond_id値を使用し、このsecond_idをidとして使用し、auto_incrementsをすべてのレコードに配置する必要があります。 = 0、ステータスは0です。

以下の表では、id 5のレコードのみが更新され、second_id 6(最後のsecond_id 5 + 1)が更新されます。

これはSQL Statmentでのみ可能ですか?更新後の

 
+------+------------+---------+---------+--------+ 
| id | second_id | y  | z  | status | 
+------+------------+---------+---------+--------+ 
| 1 |  3 |  ja | 1  | 0 | 
| 2 |  4 |  jaa | 2  | 0 | 
| 3 |  5 |  ja | 1  | 0 | 
| 4 |  0 | jaaa | 3  | 1 | 
| 5 |  0 |  jaa | 2  | 0 | 
| 6 |  0 | aaaaa | 2  | 0 | 
+------+------------+---------+---------+--------+ 

結果:

 
+------+------------+---------+---------+--------+ 
| id | second_id | y  | z  | status | 
+------+------------+---------+---------+--------+ 
| 1 |  3 |  ja | 1  | 0 | 
| 2 |  4 |  jaa | 2  | 0 | 
| 3 |  5 |  ja | 1  | 0 | 
| 4 |  0 | jaaa | 3  | 1 | 
| 5 |  6 |  jaa | 2  | 0 | 
| 6 |  7 | aaaaa | 2  | 0 | 
+------+------------+---------+---------+--------+ 
+0

どのデータベースを使用していますか? – Aducci

+0

私はMySQLデータベースを使用しています。 –

答えて

0

SQLは、あなたが求めているものを行います次:

MS SQL:

DECLARE @I INT = (SELECT TOP 1 SECOND_ID FROM TESTTABLE ORDER BY SECOND_ID DESC) 

UPDATE TESTTABLE 
SET SECOND_ID = @I, @I = @I + 1 
WHERE SECOND_ID = 0 AND STATUS = 0 

のMySQL:

SET @I := (SELECT second_id FROM MyTable ORDER BY second_id DESC LIMIT 1); 

UPDATE MyTable 
SET second_id = @I := @I + 1 
WHERE second_id = 0 AND status = 0; 

単一行のソリューションの場合は、ストアドプロシージャを作成します。

DELIMITER $$ 

CREATE PROCEDURE RunIncrement() 
BEGIN 
DECLARE I = (SELECT second_id FROM MyTable ORDER BY second_id DESC LIMIT 1); 
UPDATE MyTable 
SET second_id = I := I + 1 
WHERE second_id = 0 AND status = 0; 
END$$ 

DELIMITER ; 

必要に応じて手順を呼び出します。

CALL RunIncrement(); 
+0

どうすれば1つのステートメントに入れることができますか?私はこれらが2つのステートメントかと思いますか? –

+0

@ wp-developerこれがMySQLだと言う前に私はこれに答えました。私は今MySQLバージョンで作業しています。 – Ethilium

+0

@ wp-developer私はMySQLを含むように私の答えを更新しました。私はそれが正しい構文だと信じていますが、私は現在それをテストすることはできません。 – Ethilium