基于第二个表在MS SQL 2008中插入/更新记录,然后保持日期一致

时间:2014-11-22 01:14:35

标签: sql-server sql-server-2008 join insert

很抱歉,如果之前已经提出此类或类似内容,但我已经搜索了一段时间,但无法找到任何答案或线索。

所以我有两个表格,其数据如下:

表A

PK  START    STOP       DATA
1  1/1/2013  12/31/2013  AAA
1  1/1/2014  12/31/2014  AAA
2  1/1/2013  12/31/2013  BBB
2  1/1/2014  12/31/2014  BBB

表B

PK  DATE     DATA
1  5/1/2013  CCC
1  8/1/2014  (null)
2  6/1/2014  QQQ

现在我需要做的是更新tableA以插入前一条记录的副本,如果在STARTB和STOP之间的tableB中有相应的记录。

例如,在这个例子中,这将是我对tableA的所需更新:

PK  START    STOP        DATA
1  1/1/2013  4/30/2013   AAA
1  5/1/2013  12/31/2013  CCC
1  1/1/2014  7/30/2014   AAA
1  8/1/2014  12/31/2014  (null)
2  1/1/2013  12/31/2013  BBB
2  1/1/2014  5/31/2014   BBB
2  6/1/2014  12/31/2014   QQQ

这是我到目前为止所写的内容,但它似乎并没有起作用,因为对前一个记录日期的更新总是搞砸了。

--For copying records
SELECT 
    A.PK, B.DATE AS START, A.STOP, B.DATA
INTO TEMP_TABLE
FROM TABLEA A
INNER JOIN TABLEB B ON B.PK=A.PK AND B.DATE BETWEEN A.START AND A.STOP

--For updating records
UPDATE A
SET A.STOP=DATEADD(DD,-1,TT.START)
FROM TABLEA A
INNER JOIN TEMP_TABLE TT ON TT.PK=A.PK AND TT.STOP=A.STOP

--Insert the records
INSERT INTO TABLEA SELECT * FROM TEMP_TABLE

我的推理是否有问题,还是有更好的方法可以解决这个问题?任何意见都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我有两个建议。首先,我认为在您的“复制记录”选择中,您最后选择的列应该是B.DATA而不是A.DATA

其次,您将临时表命名为#TEMP_TABLE。使用散列前缀使其成为一个实际的临时表,它将在tempdb中创建,并在会话结束时超出范围,并且对其他会话不可见。

通过这两个调整,您的代码似乎与此处的简单示例一起使用。但是,如果您的实际数据具有更复杂的关系,例如tableb包含多个对应于tablea中给定行的行,则您的方法可能无法保持。