0

我需要在表中按性别更新具有 2 个不同值但在 1 个查询中的列(只有一个更新)。我有一张桌子,里面有男性和女性的员工,如下所示:

CREATE TABLE tb_Employee
(
  FNAME nvarchar(50) not NULL,
  LNAME nvarchar(50) not NULL,
  ID int not NULL,
  BDATE date not NULL,
  ADD_STREET nvarchar(50) NULL,
  ADD_NUM nvarchar(50) NULL,
  ADD_CITY nvarchar(50) NULL,
  Gender nvarchar(50) not NULL,
  salary dec(8,2) DEFAULT 0.0,
  PRIMARY KEY(ID),
  constraint Employee_Gender_value check (Gender in('Male','Female'))
)    

insert into tb_Employee values 
('Tom','Cohen',1,'01/2/1990','AA','11','LONDON','Male',4000),
('Pam','Jackson',2,'02/3/1989','BB','11','Delhi','Female',3000),
('John','Labor',3,'03/4/1988','CC','11','Delhi','Male',3500),
('Sam','Kruz',4,'04/5/1987','DD','11','New York','Male',4500),
('Todd','Pit',5,'01/2/1986','EE','11','Delhi','Male',2800),
('Ben','Jonson',6,'01/2/1985','FF','11','LONDON','Male',7000),
('Sara','Parker',7,'01/2/1984','GG','11','LONDON','Male',4800),
('Valiarie','Russell',8,'01/2/1983','HH','11','LONDON','Male',5500),
('James','Ten',9,'01/2/1980','AA','II','New York','Female',6500),
('Russell','Ted',10,'01/2/1978','AA','JJ','New York','Female',8800)

我也有一个这样的功能:(它给了我一张只有我发送的性别的员工表)

create function getEmployeeByGender(@gender nvarchar(50))
returns table
as
return (select * from tb_Employee where Gender=@gender)

但我无法让它在 1 个查询中更新

update dbo.getEmployeeByGender('Female')
set ADD_STREET = 'bbb'
update dbo.getEmployeeByGender('Male')
set ADD_STREET = 'aaa'
4

3 回答 3

4

您可以在没有函数的情况下使用以下内容UPDATE(只是一个简单UPDATE的 with WHERE):

UPDATE tb_Employee 
    SET ADD_STREET = CASE WHEN Gender = 'Male' THEN 'aaa' ELSE 'bbb' END
WHERE Gender IN ('Male', 'Female')

dbfiddle.uk 上的演示

如果您真的需要使用该功能,您可以使用INNER JOIN

UPDATE tb_employee SET ADD_STREET = c.ADD_STREET
FROM tb_employee e INNER JOIN (
    SELECT ID, 'aaa' AS ADD_STREET FROM getEmployeeByGender('Male')
    UNION ALL   
    SELECT ID, 'bbb' FROM getEmployeeByGender('Female')
) c ON e.ID = c.ID;

dbfiddle.uk 上的演示

于 2019-03-10T20:54:26.553 回答
0

您可以将函数用作更新的一部分的唯一方法如下 - 但这样做没有任何好处。

update dbo.tb_Employee
  set ADD_STREET = 'bbb'
where id in (select id from dbo.getEmployeeByGender('Female'))

update dbo.tb_Employee
  set ADD_STREET = 'aaa'
where id in (select id from dbo.getEmployeeByGender('Male'))

或以下内容,但同样无益(至少不是问题的措辞方式)

update dbo.tb_Employee
  set ADD_STREET = case when id in (select id from dbo.getEmployeeByGender('Male')) then 'aaa' else 'bbb' end
于 2019-03-10T21:01:03.227 回答
0

您的功能方式使这种情况过于复杂。但是让我假设您的实际问题并不那么简单。毕竟,简单update是最好的方法。

我建议left join这样做:

update dbo.tb_Employee
    set ADD_STREET = (cse when f.id is not null then 'bbb' else 'aaa')
    from dbo.tb_Employee e left join
         dbo.getEmployeeByGender('Female') f
         on f.id = e.id left join
         dbo.getEmployeeByGender('Male') m
         on m.id = e.id left join
    where m.id is not null and f.id is not  null
于 2019-03-10T21:07:21.200 回答