【问题标题】:Update statement based on select SQL server基于 select SQL server 的更新语句
【发布时间】:2013-02-11 09:47:34
【问题描述】:

我选择了完美的选择。

update ClientS set StatusID=4
where ClientID= (select P.ClientID
   ,LastName+' '+FirstName as Name 
   ,Address
   ,max(p.PickupDate)as 'Last Pickup'
   ,DATEDIFF(month,max(p.PickupDate),GETDATE())as'last pickup was months ago'
from Pickup P
join Clients C on P.ClientID= C.ClientID
where WIC=0 and C.StatusID = 1 or WIC=0 and C.StatusID = 2
group by p.clientid, lastname + ' ' + firstname,address
order by 4)

我需要基于此选择中的一个last pickup was months ago 的更新语句。我需要在 Clients 表中更新客户 StatusID 并将其设置为 4,仅适用于此选择中最后一次取货时间超过 2 个月的客户。 到目前为止我有这个

create procedure pr_UpdateStatusHwoPickupMoreThanTwoM 
AS
update ClientS set StatusID=4
where ClientID= (select P.ClientID
   ,LastName+' '+FirstName as Name 
   ,Address
   ,max(p.PickupDate)as 'Last Pickup'
   ,DATEDIFF(month,max(p.PickupDate),GETDATE())as'last pickup was months ago'
from Pickup P
join Clients C on P.ClientID= C.ClientID
where WIC=0 and C.StatusID = 1 or WIC=0 and C.StatusID = 2
group by p.clientid, lastname + ' ' + firstname,address
order by 4)

我知道这是不对的,我需要以某种方式指定最后一次取货是在 2 个多月前,但无法弄清楚如何仅为那些 ClientID 更改 StatusID。任何想法如何做到这一点?

【问题讨论】:

    标签: sql sql-server select sql-update updates


    【解决方案1】:

    试试这个

    update C
    set StatusID=4
    from (SELECT P.ClientID, MAX(p.PickupDate) MaxPickupDate
          FROM @Pickup P
          group by P.Clientid) P
         join @Clients C on P.ClientID= C.ClientID
    where C.WIC=0 and C.StatusID in (1, 2)
          AND P.MaxPickupDate<DATEADD(month,-2,GETDATE())
    

    还有,你这里有错误

    where WIC=0 and C.StatusID = 1 or WIC=0 and C.StatusID = 2
    

    对于 WIC=0 的任何行,此条件都为真,您可以通过这种方式进行更正

    WHERE WIC=0 AND C.StatusID in (1,2)
    

    【讨论】:

    • 不喜欢 group by Msg 156, Level 15, State 1, Line 6 关键字'group'附近的语法错误。
    • @AndreyIvanov 我更新了答案。只是忘了UPDATE FROM 不允许GROUP BY
    • 它将所有客户端设置为非活动状态 ID 4,很好,我是在测试表上而不是在数据库中的真实表上做到的:)
    • @Iror 感谢!问题出在 WHERE WIC=0 AND C.StatusID in (1,2) 我将其更改为 WHERE C.StatusID in (1,2) 和 WIC=0 。它开始正常工作!斯帕西博
    • @AndreyIvanov 经验告诉我,没有魔法,只有我们这样做:)
    【解决方案2】:

    试试这个查询

    对于 SQL 服务器

    update ClientS set StatusID=4
    where ClientID= (select P.ClientID
    from Pickup P
    join Clients C on P.ClientID= C.ClientID
    where WIC=0 and C.StatusID = 1 or WIC=0 and C.StatusID = 2
    group by p.clientid 
    having max(p.PickupDate) < DATEADD(month,-2,GETDATE()));
    

    您的内部查询返回 1 行的多个列,您仅与 clientId 进行比较,这就是您没有得到所需结果的原因。

    【讨论】:

    • 抛出错误消息 4145,级别 15,状态 1,第 7 行 在预期条件的上下文中指定的非布尔类型表达式,靠近 ')'。
    • 你使用的是哪个版本的sqlserver?
    • 是sql express r2 2008 SP2
    • 错误更改仍然不起作用 消息 102,级别 15,状态 1,第 7 行 ';' 附近的语法不正确。
    • Msg 206, Level 16, State 2, Line 1 操作数类型冲突:日期与 int 不兼容。在我的选择中,我已经计算了月份,它是最后一列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2021-12-05
    • 1970-01-01
    • 2010-11-06
    相关资源
    最近更新 更多