【问题标题】:Update column of different table based on manipulated result of another table根据另一个表的操作结果更新不同表的列
【发布时间】:2015-11-18 02:08:03
【问题描述】:

我有一个像下面这样的 table1 有超过 40 万条记录。下面我只是展示例子,它的样子。我想编写一些查询来遍历每一行并找到其对应的日期;如果帐户 ID 的所有日期都存在,那么我必须更新另一个表 2“是”。而且,如果任何一个日期为空(对于任何帐户 ID),那么我必须将 table2 标志更新为“否”。

这是我的源表 1。

表1

 Account ID | Date
----------- |------------
   1        | 12-03-2015
   1        | 11-03-2015
   1        | 11-04-2015
   1        | 01-03-2015
   2        | 06-03-2015
   2        | 11-03-2015
   2        | Null
   2        | 01-03-2015

这是 table2 结果的样子(查询执行后)

表2

Account ID | Flag
-----------|------
1          | Yes
2          | No

第二,如果几天后,帐户 ID 的日期从空更改为实际日期(例如 07-07-2015),则表 2“帐户 ID 2”值应从“否”更改为“是”。所以几天后 Table2 应该是这样的

Account ID | Flag
-----------|------
1          | Yes
2          | Yes

希望我已经正确解释了。我正在考虑使用光标,但是,我不确定如何使用它,光标真的能解决这个问题吗?有没有其他方法可以实现这一目标?上网查了一下,没找到合适的解决办法,求大神帮忙?

【问题讨论】:

  • 表 2 是否可以只是表 1 的视图,带有简单的 case 语句?那你就不用更新了,会自动完成的
  • Table2 是不同的表。在这里尝试了一个答案:sqlfiddle.com/#!15/b8fbf/1。显示错误。

标签: sql-server sql-server-2008 tsql sql-server-2005


【解决方案1】:

您需要改变思维方式,不再关注每一行。这是一个非常简单的基于集合的解决方案。您还应该使用比 DATE 和 Flag 更好的名称,但无论如何,这将返回您想要的输出。

select AccountID
    , case MIN(case when [Date] is null then '' else [DATE] end) when '' then 'No' else 'Yes' end as Flag
from Table1
group by AccountID

【讨论】:

  • 我需要更新table2,如何更新。在这里尝试过 (sqlfiddle.com/#!15/b8fbf/1),但是,出现错误。
  • 你真的用过postgre吗?您已用 sql server 标记了此问题,但您的 sqlfiddle 使用的是 postgre。将代码复制并粘贴到 sql server 中就可以了。
  • 对不起。我需要它用于 SQL 服务器。会尝试更新。谢谢。
  • 那么您发布的代码应该可以正常工作。只需将您的小提琴更改为使用 sql server,它就可以正常工作。 sqlfiddle.com/#!6/b8fbf/1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 2011-11-25
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多