2017-03-03 54 views
0

说我有一个MySQL数据库是这样的:更新的列,其中列数<2在MySQL

physicians database 
Name | Specialty 
---------------- 
Bob  Nurse 
Susan  Nurse 
Joan  Driver 

我想更新数据库,使得小于2计数任何专业移动到Other Specialties

因此数据库应更新这样的:

physicians database 
Name | Specialty 
---------------- 
Bob  Nurse 
Susan  Nurse 
Joan  Other Specialties 

这个查询的实际数据库的大得多。

我尝试此查询:

UPDATE physicians 
(SELECT Specialty FROM physicians GROUP BY Specialty 
    HAVING COUNT(Specialty) = 1) AS counter 
SET Specialty = 'Other Specialties' 
WHERE Specity = counter 

但我发现了一个语法错误,不知道我做错了。

+1

你得到什么语法错误? –

+0

Update语句语法不允许使用您正在使用的subselect构造 - UPDATE表(subselect)set column = value where condition'''。您可以删除子选票,但恐怕您并不真正了解其后果。 – Anand

回答

2

试试这个UPDATE

UPDATE physicians 
SET Specialty = 'Other Specialties' 
WHERE Specialty IN (SELECT Specialty 
        FROM (SELECT Specialty 
         FROM physicians 
         GROUP BY Specialty 
         HAVING COUNT(*) = 1) AS t) 

UPDATE使用子查询,以获得所有Specialty值是唯一的。然后它使用这些值来执行UPDATE

注:子查询被包裹在另一个子查询,因为它的SELECT语句不能直接以更新同一个表使用的UPDATE

Demo here

+0

这工作完美,谢谢 – Jordash

1
update physicians 
set Specialty = 'Other Specialties' 
where Specialty in (
     select Specialty 
     from physicians 
     group by Specialty 
     having COUNT(Specialty) < 2 
     ) 

更新: UPDATE医生 SET专业= '其他专业' WHERE类专业(选择专业 FROM(SELECT专业 FROM医生 GROUP BY专业 HAVING COUNT(专业) 2)AS空间值);

+0

这将返回一个错误:[错误] 1093 - 表'医生'被指定两次,既作为'更新'的目标和作为一个单独的数据源 – Jordash

2

如果你想用你的查询结构可能将其更改为

UPDATE physicians inner join 
(SELECT Specialty FROM physicians GROUP BY Specialty 
HAVING COUNT(Specialty) = 1) AS counter on physicians.speciality = counter.specialty 
SET Specialty = 'Other Specialties'