Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于另一个公共列,使用另一个列的值更新一个列_Sql_Sql Server 2008 - Fatal编程技术网

Sql 基于另一个公共列,使用另一个列的值更新一个列

Sql 基于另一个公共列,使用另一个列的值更新一个列,sql,sql-server-2008,Sql,Sql Server 2008,我有一个300万行的大型事务数据表,可以简化为: ID File DOB -------------------------- 1 File1 01/01/1900 2 File1 03/10/1978 3 File1 03/10/1978 4 File2 15/07/1997 5 File2 01/01/1900 6 File2 15/07/1997 在某些情况下,没有日期。我想更

我有一个300万行的大型事务数据表,可以简化为:

ID  File        DOB
--------------------------
1   File1       01/01/1900
2   File1       03/10/1978
3   File1       03/10/1978
4   File2       15/07/1997
5   File2       01/01/1900
6   File2       15/07/1997
在某些情况下,没有日期。我想更新日期字段,使其与具有日期的文件的其他记录相同。所以记录1的DOB将变为1978年10月3日,因为该文件的记录2和记录3都有该日期。同样,记录5将变为1997年7月15日

实现这一目标最有效的方法是什么


谢谢。

我不知道最有效的方法是什么,但我可以想出一个解决方案……用下面的查询创建一个临时表。虽然我不确定SQLServer2008的确切关键字,但这可能会起作用,或者您可能需要更改关键字,如to_date及其格式

创建表格新表格作为 按minDOB=to_date'01/01/1900','dd/mm/yyyy'的文件,从三百万个表格组中选择file,minDOB作为默认_日期,maxDOB作为固定_日期

所以你的新桌子会有 列标题:文件、默认日期、固定日期 值:文件1、1900年1月1日、1978年10月3日

现在,在三百万张表上运行更新可能不明智,但如果您认为可以:

更新T1 设置T1.DOB=T2.fixed\u日期 从300万表T1 内部联接新表T2
在T1.file=T2.file上

假设您的表名为Files,那么这将起作用:

UPDATE f1 SET f1.DOB=f2.MaxDOB
  FROM files f1
  JOIN (SELECT File, MAX(DOB) AS MaxDOB FROM files GROUP BY File) f2 ON
    f2.File=f1.File;

就性能而言,它可能不会比这更有效,但您确实需要确保文件上有一个索引DOB column set。300万条记录太多了,这个查询还将更新不需要它的记录,但是过滤掉这些记录需要更复杂的连接。无论如何您最好检查查询计划。

希望这有助于。。。拥有300万条记录肯定需要通过扫描每条记录来更新表

;WITH testCTE ([name],dobir,number)
     AS (SELECT [File],DOB, ROW_NUMBER() OVER (PARTITION BY [FILE],DOB
      ORDER BY ( SELECT 0)) RowNumber                                    
         FROM   test)
UPDATE TEST
SET DOB = tcte.dobir
FROM testCTE as tcte
LEFT JOIN TEST t on tcte.name = t.[FILE]
WHERE tcte.number > 1 and [FILE] = tcte.[name]

选择日期的逻辑是什么?如果同一个文件显示了几个不同的日期,该怎么办?哪个将用于更新,以及哪些行将被更新?1900年1月1日是否为空日期值?是否只更新日期为01/01/1900的行?01/01/1900是空日期值,是。我基本上想将DOB列更新为与该文件关联的其他记录的MAXDOB。最重要的是,DOB在与文件相关的所有记录中都是相同的。很好,这正是我要寻找的。整个桌子只用了90秒就处理好了。非常感谢。