2014-06-17 6 views
1

Je suis un débutant dans SQL Server et j'ai beaucoup de difficultés à résoudre la tâche suivante: J'ai 2 tables:colonne mise à jour dans SQL Server

User_Info 
    User_UID UNIQUEIDENTIFIER ROWGUIDCOL NULL DEFAULT(newid()) 
    FirstName VARCHAR(50) 
    LastName VARCHAR(50) 
    Email VARCHAR(50) 

Session 
    User_UID CHAR(40) 
    Session_ID PK INT 

En USER_INFO j'ai différents User_UID correspondant le même utilisateur, c'est-à-dire un utilisateur ayant le même Prénom, Nom et Email. Je souhaite nettoyer la table User_Info en supprimant l'utilisateur redondant (ayant le même triplet: FirstName, LastName et Email (non nul et non vide)) et mettre à jour la colonne User_UID dans la table Session vers le user_uid correspondant restant dans le Table User_Info et pointant vers le même utilisateur.

Ce sont mes tableaux:

CREATE TABLE user_info (
    User_UID uniqueidentifier ROWGUIDCOL NULL DEFAULT (newid()), 
    FirstName varchar(50), 
    LastName varchar(50), 
    Email varchar(50) 
) 

INSERT user_info VALUES(newid(), 'Marc', 'Jalloul', '[email protected]') 
INSERT user_info VALUES(newid(), 'Marc', 'Jalloul', '[email protected]') 
INSERT user_info VALUES(newid(), 'Estelle', 'Jalloul', '[email protected]') 
INSERT user_info VALUES(newid(), 'Estelle', 'Jalloul', '[email protected]') 
INSERT user_info VALUES(newid(), 'Tony', 'Jalloul', '[email protected]') 
INSERT user_info VALUES(newid(), 'Tony', 'Jalloul', '[email protected]') 
INSERT user_info VALUES(newid(), '', 'Mirebeau', '[email protected]') 
INSERT user_info VALUES(newid(), '', 'Mirebeau', '[email protected]') 
INSERT user_info VALUES(newid(), NULL, 'Mirebeau', '[email protected]') 
INSERT user_info VALUES(newid(), NULL, 'Mirebeau', '[email protected]') 

CREATE TABLE session (
    session_id INT IDENTITY(1, 1), 
    User_UID char(40) 
) 

INSERT Session 

SELECT User_UID FROM user_info 

Comme résultat escompté 2 lignes doivent être supprimées de User_info (lignes 2 et 6 (ou 1 et 5 en fonction de la commande)) et le User_UID de la ligne 2 et 6 de la table de session doit être mis à jour à User_UID des lignes 1 et 5 respectivement.

Ceci est mon code pour supprimer l'utilisateur redondant de USER_INFO:

DELETE UI 
FROM (
    SELECT * 
     ,row_number() OVER (
      PARTITION BY FirstName 
      ,LastName 
      ,Email ORDER BY User_UID 
      ) AS RowNum 
    FROM user_info 
    WHERE FirstName IS NOT NULL 
     AND FirstName <> '' 
     AND LastName IS NOT NULL 
     AND LastName <> '' 
     AND Email IS NOT NULL 
     AND Email <> '' 
    ) r 
INNER JOIN user_Info UI 
    ON r.User_UID = UI.User_UID 
WHERE r.RowNum > 1 

Mais je ne trouve pas encore une façon de mettre à jour le terrain User_UID de table de session sans utiliser le curseur

Si quelqu'un peut aider moi et me donner le code de cette tâche si possible

Merci

+0

Question - lorsque vous supprimez les utilisateurs en double, pourquoi avez-vous besoin de conserver les enregistrements dans la table 'Session'? –

+0

Je veux nettoyer uniquement la table User_Info et conserver tous les ID de session sans en supprimer aucun – user3569267

Répondre

2

Vous pouvez utiliser la clause OUTPUT pour obtenir les lignes supprimées une nd met à jour la session à partir du résultat, en rejoignant user_info.

Declare @tab Table (User_UID uniqueidentifier 
       , FirstName varchar(50), 
        LastName varchar(50), 
        Email varchar(50)) 

DELETE UI 
OUTPUT Deleted.* into @tab 
FROM (
    SELECT * 
     ,row_number() OVER (
      PARTITION BY FirstName 
      ,LastName 
      ,Email ORDER BY User_UID 
      ) AS RowNum 
    FROM user_info 
    WHERE FirstName IS NOT NULL 
     AND FirstName <> '' 
     AND LastName IS NOT NULL 
     AND LastName <> '' 
     AND Email IS NOT NULL 
     AND Email <> '' 
    ) r 
INNER JOIN user_Info UI 
    ON r.User_UID = UI.User_UID 
WHERE r.RowNum > 1 



update Session 
set User_UID=u.User_UID 
from @tab t 
join user_info u on t.FirstName=u.FirstName and t.LastName=u.Lastname and t.Email=u.Email 
where t.User_UID=session.User_UID 
+0

+1. Everoyne en lisant cela lirait mieux sur la clause de sortie - il est formidable et résout un gros problème en SQL - sachant quelles valeurs ont changé;) – TomTom

+0

Bonjour, le code suivant: update Session set User_UID = u.User_UID from @tab t joindre user_info u sur t.FirstName = u.FirstName et t.LastName = u. Nom et t.Email = u.Email Met à jour toutes les lignes de la table de session. Le résultat attendu ne devrait mettre à jour que les lignes 2 et 6 (ou 1 et 5) Merci pour votre aide – user3569267

+0

@ user3569267 Désolé a raté la condition 'where t.User_UID = session.User_UID' – bummi

Questions connexes