很抱歉,如果之前已经提出此类或类似内容,但我已经搜索了一段时间,但无法找到任何答案或线索。
所以我有两个表格,其数据如下:
表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
我的推理是否有问题,还是有更好的方法可以解决这个问题?任何意见都将不胜感激。
答案 0 :(得分:0)
我有两个建议。首先,我认为在您的“复制记录”选择中,您最后选择的列应该是B.DATA
而不是A.DATA
。
其次,您将临时表命名为#TEMP_TABLE
。使用散列前缀使其成为一个实际的临时表,它将在tempdb
中创建,并在会话结束时超出范围,并且对其他会话不可见。
通过这两个调整,您的代码似乎与此处的简单示例一起使用。但是,如果您的实际数据具有更复杂的关系,例如tableb包含多个对应于tablea中给定行的行,则您的方法可能无法保持。