Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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 R2 - Fatal编程技术网

Sql 基于行的另一个值更新行的值列

Sql 基于行的另一个值更新行的值列,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我有一个历史数据表,数据如下: 在我的情况下,产品id(110111112)改变了价格,这样我就拥有了具有产品更新日期值的相同产品,有时我也可以拥有相同的重复数据,而不改变任何信息 +------+------------+--------------+---------------+-----------------------------+-------------------------+-------------------------+----------------+ | id

我有一个历史数据表,数据如下:

在我的情况下,
产品id
(110111112)改变了
价格
,这样我就拥有了具有
产品更新日期
值的相同产品,有时我也可以拥有相同的重复数据,而不改变任何信息

+------+------------+--------------+---------------+-----------------------------+-------------------------+-------------------------+----------------+
| id   | product_id | product_name | product_Price |       product_addDate       |   product_UpdateDate    |      Insertdate_DB      | Updatedate_DB  |
+------+------------+--------------+---------------+-----------------------------+-------------------------+-------------------------+----------------+
|    1 |        110 |    DELL      |          1000 |    2017-03-01 08:00:00.000  | NULL                    | 2017-03-06 10:00:00.000 | NULL           |
|    2 |        111 |    HP        |           900 |    2017-03-01 08:00:00.000  | NULL                    | 2017-03-06 10:00:00.000 | NULL           |
| 3    |        112 |    Mac       |          1300 |    2017-03-01 08:00:00.000  | NULL                    | 2017-03-06 10:00:00.000 | NULL           |
| 4    |        113 |   Lenovo     |           950 |    2017-03-01 08:00:00.000  | NULL                    | 2017-03-06 10:00:00.000 | NULL           |
| 5    |        110 |   DELL       |           900 |    2017-03-04 08:00:00.000  | 2017-03-04 08:00:00.000 | 2017-03-07 10:00:00.000 | NULL           |
| 6    |        111 |    HP        |           800 |    2017-03-04 08:00:00.000  | 2017-03-04 08:00:00.000 | 2017-03-07 10:00:00.000 | NULL           |
| 7    |        112 |    Mac       |           120 |    2017-03-04 08:00:00.000  | 2017-03-04 08:00:00.000 | 2017-03-07 10:00:00.000 | NULL           |
+------+------------+--------------+---------------+-----------------------------+-------------------------+-------------------------+----------------+
我想要的是执行更新查询以获得如下结果:

 +----+------------+--------------+---------------+-------------------------+-------------------------+-------------------------+---------------+
| id | product_id | product_name | product_Price |     product_addDate     |   product_UpdateDate    |      Insertdate_DB      | Updatedate_DB |
+----+------------+--------------+---------------+-------------------------+-------------------------+-------------------------+---------------+
|  1 |        110 | DELL         |          1000 | 2017-03-01 08:00:00.000 | 2017-03-04 08:00:00.000 | 2017-03-06 10:00:00.000 | GETDATE()     |
|  2 |        111 | HP           |           900 | 2017-03-01 08:00:00.000 | 2017-03-04 08:00:00.000 | 2017-03-06 10:00:00.000 | GETDATE()     |
|  3 |        112 | Mac          |          1300 | 2017-03-01 08:00:00.000 | 2017-03-04 08:00:00.000 | 2017-03-06 10:00:00.000 | GETDATE()     |
|  4 |        113 | Lenovo       |           950 | 2017-03-01 08:00:00.000 | NULL                    | 2017-03-06 10:00:00.000 | NULL          |
|  5 |        110 | DELL         |           900 | 2017-03-04 08:00:00.000 | NULL                    | 2017-03-07 10:00:00.000 | NULL          |
|  6 |        111 | HP           |           800 | 2017-03-04 08:00:00.000 | NULL                    | 2017-03-07 10:00:00.000 | NULL          |
|  7 |        112 | Mac          |           120 | 2017-03-04 08:00:00.000 | NULL                    | 2017-03-07 10:00:00.000 | NULL          |
+----+------------+--------------+---------------+-------------------------+-------------------------+-------------------------+---------------+
下面的查询可以更新
产品\u UpdateDate

update tablename 
set    product_UpdateDate = case when tablename.product_UpdateDate is null 
                                      then t.product_UpdateDate
                                      else null end
from   tablename 
join   tablename t 
on     tablename.product_id = t.product_id
and    t.ID <> tablename.id `
更新表名
当tablename.product\u UpdateDate为空时,设置product\u UpdateDate=大小写
然后t.product_更新
else空端
从表名
联接表名
在tablename.product\u id=t.product\u id上
和t.ID tablename.ID`
但是,当我尝试更新此列时,我还想用
GETDATE()
值更改
Updatedate\u DB
,所有行都有值
GETDATE()
,但我只想更改值已更改的行

感谢您的帮助

我认为
行号()
可能是一种更简单的方法。这一逻辑很难理解,但以下应该是您问题中的数据:

with toupdate as (
      select t.*,
             row_number() over (partition by product_id order by id) as seqnum,
             count(*) over (partition by product_id) as cnt
      from t
     )
update toupdate
    set product_UpdateDate = (case when seqnum = 1 then product_addDate end),
        Updatedate_DB = (case when seqnum = 1 then getdate() end)
    where cnt > 1;

感谢回复,这是工作,但有一个问题是,当我下次执行查询时,
Updatedate_DB
更改信息我的情况我不想更改
Updatedate_DB
,即使我多次执行查询,因为我将在
SSIS包中使用查询
@Mark。这听起来像是一个不属于这个问题的要求。也许你应该问另一个问题,提供合适的数据和期望的结果。