【问题标题】:I need to Update one value of a field that contains multiple values. I have tried Top 1, Min, Max, and I cannot get it to work我需要更新包含多个值的字段的一个值。我已经尝试过 Top 1、Min、Max,但我无法让它工作
【发布时间】:2019-06-28 16:53:26
【问题描述】:

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

这是一个布局示例

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)

失败(错误)

【问题讨论】:

    标签: sql sql-server ssms-2016


    【解决方案1】:

    使用可更新的 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 中的正确字段。

    【讨论】:

    • 我是这样输入 newid() 还是应该是实际值?
    • @MDaniel 。 . . newid() 强制执行随机顺序。您实际上可以在其中放置任何内容(尽管 SQL Server 不允许使用常量)。 row_number() 保证只有一行有“1”。 order by 控制哪一个。
    • 谢谢。这与 newid() 配合得很好,并且完全符合我的需要。
    猜你喜欢
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2021-01-25
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多