Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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更新ID(第2个,共6个)_Sql_Sql Server_Tsql - Fatal编程技术网

仅使用最新日期SQL更新ID(第2个,共6个)

仅使用最新日期SQL更新ID(第2个,共6个),sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下表格: 以及: 我提出了这个问题: Update Table 1 SET DY_H_ID = ( SELECT MAX(ID) FROM Table 2 WHERE H_DateTime <= DY_Date AND H_IDX = DY_IDX AND H_HA_ID = 7 AND H_HSA_ID = 19 AND H_Description LIKE 'Diary item added for :%'

我有以下表格:

以及:

我提出了这个问题:

Update Table 1 
SET DY_H_ID = ( 

    SELECT MAX(ID) 
    FROM Table 2
    WHERE H_DateTime <= DY_Date 
    AND H_IDX = DY_IDX 
    AND H_HA_ID = 7 
    AND H_HSA_ID = 19 
    AND H_Description LIKE 'Diary item added for :%'

) 
WHERE DY_H_ID IS NULL AND DY_IDX IS NOT NULL
其结果是:

但是,此查询将更新所有6行。我只需要用最新日期更新两行,即“2013-08-29 15:00:00.000”。这意味着6条记录中只有2条将被更新,其余4条将保持为空


如何通过添加到上述查询来实现这一点?我知道这可能不太理想,但除了这样做别无选择。我不明白的是,如何只选择最新的日期而不硬编码。此数据可能会更改,并且不会总是相同的日期等。

只需在其中添加另一个条件:

Update Table 1 
SET DY_H_ID = ( 

    SELECT MAX(ID) 
    FROM Table 2
    WHERE H_DateTime <= DY_Date 
    AND H_IDX = DY_IDX 
    AND H_HA_ID = 7 
    AND H_HSA_ID = 19 
    AND H_Description LIKE 'Diary item added for :%'

) 
WHERE DY_H_ID IS NULL AND DY_IDX IS NOT NULL
and DY_Date = (select max(DY_Date) from Table 1)

只需在其中添加另一个条件:

Update Table 1 
SET DY_H_ID = ( 

    SELECT MAX(ID) 
    FROM Table 2
    WHERE H_DateTime <= DY_Date 
    AND H_IDX = DY_IDX 
    AND H_HA_ID = 7 
    AND H_HSA_ID = 19 
    AND H_Description LIKE 'Diary item added for :%'

) 
WHERE DY_H_ID IS NULL AND DY_IDX IS NOT NULL
and DY_Date = (select max(DY_Date) from Table 1)
试试这个:

UPDATE TABLE 1 
SET    DY_H_ID = (SELECT Max(ID) 
                  FROM   TABLE 2 
                  WHERE  H_DATETIME <= DY_DATE 
                         AND H_IDX = DY_IDX 
                         AND H_HA_ID = 7 
                         AND H_HSA_ID = 19 
                         AND H_DESCRIPTION LIKE 'Diary item added for :%') 
WHERE  DY_H_ID IS NULL 
       AND DY_IDX IS NOT NULL 
       AND DY_DATE = (SELECT Max(DY_DATE) 
                      FROM   TABLE1) 
试试这个:

UPDATE TABLE 1 
SET    DY_H_ID = (SELECT Max(ID) 
                  FROM   TABLE 2 
                  WHERE  H_DATETIME <= DY_DATE 
                         AND H_IDX = DY_IDX 
                         AND H_HA_ID = 7 
                         AND H_HSA_ID = 19 
                         AND H_DESCRIPTION LIKE 'Diary item added for :%') 
WHERE  DY_H_ID IS NULL 
       AND DY_IDX IS NOT NULL 
       AND DY_DATE = (SELECT Max(DY_DATE) 
                      FROM   TABLE1) 
使用CTE,与SQL-Server-2005或更高版本兼容

使用CTE,与SQL-Server-2005或更高版本兼容


您使用的是哪个版本的sql server?我使用的是sql server 2012。您使用的是哪个版本的sql server?我使用的是sql server 2012。如果在WHERE子句中添加附加条件,效果会非常好。谢谢@Luis LL我可以问一下@Luis LL,如果这个更新语句被使用过,比如说1000 000条记录,那么使用cte方法会有任何性能改进吗?这种做法是否比使用其他方法更好、更干净,或者您为什么从一开始就使用cte?没有必要,在某些情况下会非常有效,在许多情况下,cte的预取可以真正提高性能,在某些情况下不会影响性能。还有第三种尝试方法,即使用内部连接CTE查询,它也可以执行得更好。有很多不同的因素,比如索引、内存、统计数据、每个表中的行数等等,来给出一个绝对的响应。知道了,我现在明白了。我也读过一些关于使用它们进行递归等的文章,这可能非常好。这是CTE的另一个伟大用途,在上面的例子中,我使用它是为了简单,因为我不喜欢SELECT中的SELECT[mycolumns]语法。。。我的桌子。继续阅读CTE,祝你好运!如果我在WHERE子句中添加附加条件,这将非常有效。谢谢@Luis LL我可以问一下@Luis LL,如果这个更新语句被使用过,比如说1000 000条记录,那么使用cte方法会有任何性能改进吗?这种做法是否比使用其他方法更好、更干净,或者您为什么从一开始就使用cte?没有必要,在某些情况下会非常有效,在许多情况下,cte的预取可以真正提高性能,在某些情况下不会影响性能。还有第三种尝试方法,即使用内部连接CTE查询,它也可以执行得更好。有很多不同的因素,比如索引、内存、统计数据、每个表中的行数等等,来给出一个绝对的响应。知道了,我现在明白了。我也读过一些关于使用它们进行递归等的文章,这可能非常好。这是CTE的另一个伟大用途,在上面的例子中,我使用它是为了简单,因为我不喜欢SELECT中的SELECT[mycolumns]语法。。。我的桌子。继续阅读CTE,祝你好运!太好了,这在Gidil的时候非常有效。这就是为什么我是SQL noob的原因,哈哈。我想你是第一个,所以我会打标记作为答案。太好了,这是完美的@Gidil。这就是为什么我是SQL noob的原因,哈哈。我想你是第一个,所以我会记下答案。