2016-07-15 145 views
1

我有一张将联系人与公司关联的表。如果添加了多个联系人,则可以选择设置“主要”或“次要”联系人。然而,当人们添加联系人时,他们并未使用此功能。该程序已被修改,因此它会自动将首次添加到公司的联系人标记为主要联系人,但不会修复已输入的数据。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。

这怎么办?

+0

我以前的查询是错误的,试试这个查询更新接触点C1设置PrimaryContact = IF((SELECT COUNT(从通讯录C2 1)其中c2.CompanyID = c1.CompanyID通过c2.CompanyID组) > 1,0,0) –

回答

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。然后该查询的结果与应更新的表连接。

Sample SQL Fiddle

+0

内部联接后的select语句正确地标识具有单个条目(1,2,3,10和11)的行,但是我无法使更新在MS SQL Server中作为一个整体工作管理工作室(2014年)。它似乎不喜欢“as c”部分。因此,我对该表运行了查询,然后将结果复制到一个名为tCompanyIDs的新表中,仅以“CompanyID”作为唯一字段。然后我在查询中使用它: – Allan

+0

@Allan您使用[tag:MySQL]标签标记了问题,我的答案中的语法适用于该数据库。如果您使用MS SQL Server,请更改问题中的标记,然后我会更新我的答案。 – jpw

+0

即使有你的MySQL例子,我可以修改它的工作,但感谢你发布的SQL Server版本......我相信它会再次出现,我会参考回来。 – Allan