2016-07-15 232 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