2013-04-27 4 views
0

J'ai deux tables.Requête SQL avancée pour accélérer une opération

One est Started_Games:

level_id INT 
user_id INT 

L'autre est Statistics:

stat_id INT 
stat_key NVARCHAR[30] 
stat_value INT 

Mon application web se compose d'un jeu avec des niveaux qui seuls les membres peuvent jouer dans

Après avoir démarré chacun. jeu, une fonction est appelée et fait ce qui suit (dans une instruction SQL): S'il n'y a pas d'enregistrement qui contient à la fois e Id de l'utilisateur et le niveau de jeu, il a commencé-l'ajouter à la table Started_Games.

Lorsque l'utilisateur se déconnecte Je veux faire ce qui suit (Seul le SQL est nécessaire):

D'abord, sélectionnez le nombre des niveaux de jeu qu'il a commencé. Ensuite, mettez à jour le tableau Statistics dans une ligne spécifique avec le stat_key = StartedGamesCount et ajoutez-y le compte trouvé. Après cela, supprimez tous les enregistrements de l'utilisateur actuel (les lignes "comptées");

Je n'ai jamais mis en œuvre plusieurs instructions SQL dans la même requête, et c'est ce que je suis venu avec jusqu'à présent:

DELETE FROM [Started_Games] WHERE [user_id] IN (SELECT COUNT(*) FROM [Started_Games] WHERE [user_id] = @UserId) 

Notez qu'il ne comprend pas le processus de mise à jour que je veux exécuter.

Une aide?

Répondre

0

Je vous recommande d'écrire votre instruction de mise à jour, puis d'inclure les instructions de mise à jour et de suppression dans une procédure stockée et d'appeler cela à partir de votre code. A défaut, vous pouvez juste faire deux appels de base de données, un pour faire la mise à jour et un de la supprimer

create procedure sort_out_user @user_id int 
as 
begin 
    update .... 

    delete from .... 
end 

This might help

+0

Faire plus d'un des appels de base de données est exactement ce que je veux éviter. À ce moment, je ne suis pas autorisé à utiliser des procédures stockées. Cette question a été posée pour m'aider à terminer un projet que je devrais livrer dans deux mois. – Novak

0

possible ce utile pour vous -

CREATE PROCEDURE dbo.log_out 
(
    @UserId INT 
) 
AS BEGIN 

    INSERT INTO dbo.[Statistics](stat_id, stat_key, stat_value) 
    SELECT [user_id], '???', COUNT(1) 
    FROM dbo.Started_Games 
    WHERE [user_id] = @UserId 
    GROUP BY [user_id] 

    DELETE FROM dbo.Started_Games 
    WHERE [user_id] = @UserId 

END