2012-03-25 31 views
0

非常に新しいストアドプロシージャであり、クエリの動作を確認する必要はありませんが、より良いコードは非常に高い評価を受けます。
私は2つのテーブルを持っています
1.Users ===>メインレコードテーブル
2.temp_Users ===>テーブルに最新の現在のユーザ情報が含まれています

私の必要なタスクは
です。表から表にユーザーではありません
B.Add新規ユーザーtemp_Usersあなたの削除クエリがあるべき

MySQLストアドプロシージャのヘルプが必要

DELIMITER // 
    CREATE PROCEDURE checkUsers() 
     BEGIN 
     DECLARE oldusers, newusers INT DEFAULT 0 

//To catch delete users  
     SELECT COUNT(Users.Ext) INTO oldusers 
     FROM Users 
     LEFT JOIN temp_Users 
     ON temp_Users.Ext=Users.Ext 
     WHERE temp_Users.Ext IS NULL; 

//To catch new users  
     SELECT COUNT(temp_Users.Ext) INTO newusers 
     FROM Users 
     RIGHT JOIN temp_Users 
     ON temp_Users.Ext=Users.Ext 
     WHERE Users.Ext IS NULL; 

     CASE 
     WHEN oldusers>0 
     THEN DELETE FROM Users SELECT Users.Ext 
       FROM Users 
       LEFT JOIN temp_Users 
       ON temp_Users.Ext=Users.Ext 
       WHERE temp_Users.Ext IS NULL; 

     WHEN newusers>0 
     THEN INSERT INTO Users (Ext) SELECT temp_Users.Ext 
       FROM Users 
       RIGHT JOIN temp_Users 
       ON temp_Users.Ext=Users.Ext 
       WHERE Users.Ext IS NULL; 
     ELSE exit; 
     END CASE; 


     END // 
    DELIMITER ; 
+2

あなたはあなたの最初の 'SELECT'の両方を削除することができます'oldusers'と' newusers'への割り当てだけでなく、 'CASE'も削除します。 'DELETE'と' INSERT'文を実行するだけです。条件に一致する行がある場合はアクションが実行され、存在しない場合は行なわれません。 'COUNT'や変数は必要ありません。 –

+0

@KenWhiteはいこれは私の最後の選択肢ですが、これでどのように動作するかを知る必要があります。 –

+1

必要のないコードを書く方法を学びたいですか?私はそれが理にかなっていないのではないかと心配しています。あなたはより良いコードを求めました。そして、より良いコード(不要なものを取り除く)のために必要なものを教えました。 :) –

答えて

0

-

DELETE Users 
FROM Users 
LEFT JOIN temp_Users 
    ON temp_Users.Ext=Users.Ext 
WHERE temp_Users.Ext IS NULL;