SQL:更新基于列的唯一行
我有一张将联系人与公司关联的表。如果添加了多个联系人,则可以选择设置“主要”或“次要”联系人。然而,当人们添加联系人时,他们并未使用此功能。该程序已被修改,因此它会自动将首次添加到公司的联系人标记为主要联系人,但不会修复已输入的数据。SQL:更新基于列的唯一行
我想查询表,并说,如果只有一个创纪录的CompanyID设置PrimaryContact为真,但我无法弄清楚如何做到这一点。对于任何有多名联系人的公司我都不想做任何事情。例如:
CompanyID ContactID PrimaryContact
1 285 0
2 375 0
3 761 0
4 1744 0
4 2301 0
6 335 0
6 4987 0
9 809 0
9 2119 0
10 99 0
11 99 0
在上述例子中CompanyID 4,图6和9具有多个条目,所以我不想触及那些。但是1,2,3,10和11有单个条目,所以我想为这些行设置PrimaryContact为1。
这怎么办?
你想为MS SQL Server中的语法是这样的:
update contacts
set PrimaryContact = 1
where CompanyID in (
select CompanyID
from contacts
group by CompanyID
having count(distinct ContactID) = 1
)
问题之前标记为MySQL和低于原来的答案适用于这一点。
这是做这件事:
update contacts as c
inner join
(
select CompanyID
from contacts
group by CompanyID
having count(distinct ContactID) = 1
) t on c.CompanyID= t.CompanyID
set PrimaryContact = 1;
在派生表,你会发现有一个单一的使用ContactID的CompanyIDs。然后该查询的结果与应更新的表连接。
内部联接后的select语句正确地标识具有单个条目(1,2,3,10和11)的行,但是我无法使更新在MS SQL Server中作为一个整体工作管理工作室(2014年)。它似乎不喜欢“as c”部分。因此,我对该表运行了查询,然后将结果复制到一个名为tCompanyIDs的新表中,仅以“CompanyID”作为唯一字段。然后我在查询中使用它: – Allan
@Allan您使用[tag:MySQL]标签标记了问题,我的答案中的语法适用于该数据库。如果您使用MS SQL Server,请更改问题中的标记,然后我会更新我的答案。 – jpw
即使有你的MySQL例子,我可以修改它的工作,但感谢你发布的SQL Server版本......我相信它会再次出现,我会参考回来。 – Allan
我以前的查询是错误的,试试这个查询更新接触点C1设置PrimaryContact = IF((SELECT COUNT(从通讯录C2 1)其中c2.CompanyID = c1.CompanyID通过c2.CompanyID组) > 1,0,0) –