我需要更新包含多个值的字段的一个值。我已经尝试了Top 1,Min,Max,但我无法使其正常工作

时间:2019-02-04 21:46:27

标签: sql sql-server ssms-2016

我正在尝试将每家公司的联系值更新为默认值。我不在乎哪个联系人,但是只能有一个默认联系人。

这是布局的一个例子

Table: companyemail
Company field: cmp_id 6-8 digit varchar
Contact field: contact_name 50 digit varchar
Default Contact: ce_defaultcontact possible boolean values is Y or N

我有这些数据

Company: ABCDEF
Contact: John Doe  Default: N
         Jane Doe  Default: N
         John Smith Default: N

这在许多公司中都存在。我正在尝试将sql中的表更新为仅将1个联系人设置为默认联系人。我尝试了以下

1。

update companyemail
   set ce_defaultcontact = 'Y'
   where contact_name = (
   Select Top 1 contact_name 
          From companyemail
          Where ce_defaultcontact = 'N'
          Order by contact_name DESC )

 FAIL (Only set 1 contact to Y)

2。

update companyemail
   set ce_defaultcontact = 'Y'
   where contact_name = (
   Select Max(companyemail.contact_name) from companyemail)

失败(错误)

1 个答案:

答案 0 :(得分:0)

使用可更新的CTE和row_number()

with toupdate as (
      select ce.*, row_number() over (partition by cmp_id order by newid()) as seqnum
      from companyemail ce
     )
update toupdate
   set ce_defaultcontact = 'Y'
    where seqnum = 1;

我猜测cmp_id可以识别公司。如果那不是正确的字段,请在partition by中使用正确的字段。