Sottoseleziona SQL in un aggiornamento
Domanda
Oh grande StackOverflow, ti supplico ... Devo fare quanto segue:
CREA INDICE UNICO Nome utente ON Emp (Nome utente) - Sheesh!
UPDATE Emp SET
UserName = Left(FirstName,1)+LastName
DOVE NON esiste già un dipendente con quel Nome utente.
Soluzione
Ciò consentirà comunque i duplicati ... ma se vuoi quello che hai detto, Prova questo (esattamente quello che hai detto):
UPDATE Emp SET
UserName = Left(FirstName,1) + LastName
Where Not Exists (Select * From Emp
Where UserName = Left(FirstName,1) + LastName)
Immagino, tuttavia, che tu stia cercando di evitare duplicati, non semplicemente resettare UserNames dove nessuno esistente è uguale al nuovo valore proposto. In tal caso, dovresti aggiungere un indice univoco sulla colonna userName, ma prima esegui questo:
UPDATE Emp SET
UserName = Left(FirstName,1) + LastName
Where Not Exists
(Select * From Emp
Where UserName = Left(FirstName,1) + LastName)
And Not Exists
(Select * From Emp
Group By Left(FirstName,1) + LastName
Having Count(*) > 1)
Ciò ripristinerà tutti i nomi utente che possono essere ripristinati senza creare duplicati. (Non eliminerà i duplicati esistenti). Se non ci sono duplicati dopo questo, è possibile applicare l'indice.
Altri suggerimenti
Vorrei mettere un indice univoco sul nome utente e utilizzare:
UPDATE IGNORE Emp SET UserName = Left(FirstName,1)+LastName
Se il tuo database lo supporta;)
Sì, nel caso in cui non leggessi più in basso, il nome utente dovrebbe essere Unico, inoltre mi assicurerei che ci sia qualcos'altro nella clausola where perché sarà una query intensa.
Puoi prendere in considerazione la possibilità di scrivere una funzione per fare ciò in modo da aggiungere alla fine qualche altra unicità o ID se esiste (Count (*) dove userName come Username).
UPDATE Emp SET
UserName = Left(FirstName,1)+LastName
WHERE
UserName not in (Select UserName From Emp Where UserName = Left(FirstName,1) + LastName)
In primo luogo, il campo del tuo nome utente dovrebbe avere un indice univoco. Se non lo fai, t i tuoi dati sono a rischio da qualcuno che aggiorna senza usare la tua piccola dichiarazione di aggiornamento. I suggerimenti sul codice corrente non ti danno un esempio di come gestire l'impostazione del nome utente se viene utilizzato quello esistente, cosa vuoi fare? Questo dovrebbe far parte del tuo processo. L'utente ha bisogno di un nome utente.
solo per mostrare qui è un modo per gestire l'incremento del nome utente fino a quando non ne ottieni uno che non esiste. Questo esempio è un inserto non un aggiornamento, ma penso che tu possa usarlo come punto di partenza. Usando questo metodo (e questo è per un record alla volta inserimenti), nessuno entra mai nel sistema con un nome utente duplicato e non vengono generati errori se esiste una corrispondenza esatta, si sposta semplicemente per trovare la corrispondenza successiva.
CREATE PROC [dbo].[ins_MyUserTable]
(
@userID int,
@Login varchar(255)
)
As
DECLARE
@ValidateUserName varchar(50),
@NewUserName varchar(50),
@CheckUserName varchar(50),
@Holding int
-- Get User Name (first letter of first name + last name)
SELECT @NewUserName = @Login
SET @Holding = 0
-- Examine User Name (must be unique)
SELECT @ValidateUserName = 1
WHILE @ValidateUserName = 1
BEGIN
-- Check for Login
SELECT @CheckUserName = (SELECT TOP 1 login FROM MyUserTable WHERE login = @NewUserName)
IF @CheckUserName = @NewUserName
BEGIN
SELECT @Holding = @Holding + 1
SELECT @NewUserName = @Login + Convert(varchar(2), @Holding)
END
ELSE
BEGIN
SELECT @ValidateUserName = 0
END
END
-- Insert into MyUserTable
INSERT INTO MyUserTable
([user_id], login)
VALUES
(@userID, @NewUserName)