我想编写一个更新语句,通过加入MASTER_ID来比较新的代码表和旧的代码。然后如果NEW_CODE.CODE = 1234 AND OLD_CODE.CODE_ID不在CODE_MAPPING表中,则SET NEW_CODE.CODE_ID = OLD_CODE.CODE_ID AND NEW_CODE.SEQ_NO = OLD_CODE.SEQ_NO。这是我迄今为止的内容,但是如果在CODE_ID列中获得空值,它似乎无法正确更新。我想我需要做一个自我加入,但是我没有做任何事情似乎能够奏效,不胜感激。如何将此Access内部连接查询转换为SQL Server?
我有三个表数据如下:
**NEW_CODE**
MASTER_ID SEQ_NO CODE_ID CODE
100 0 XX 1234
200 0 5555
300 0 XX 1234
300 0 XX 1234
**OLD_CODE**
MASTER_ID SEQ_NO CODE_ID
100 1 D1
200 1 A1
300 1
300 2 Z1
**CODE_MAPPING**
CODE_ID
A1
B1
C1
D1
UPDATE语句:
UPDATE NEW
SET SEQ_NO = OLD.SEQ_NO,
CODE_ID = OLD.CODE_ID
FROM NEW_CODE NEW
INNER JOIN OLD_CODE OLD
ON NEW.MASTER_ID = OLD.MASTER_ID
LEFT JOIN CODE_MAPPING CM
ON OLD.CODE_ID = CM.CODE_ID
WHERE NEW.CODE = 1234
AND CM.CODE_ID IS NULL
更新后的表应该是这样的:
**UPDATED NEW_CODE**
MASTER_ID SEQ_NO CODE_ID CODE
100 0 XX 1234
200 0 5555
300 1 1234
300 2 Z1 1234
所以,唯一的应该更新的是具有MASTER_ID o的两行f 300.但由于某些原因,我得到的结果如下:
**CURRENT RESULT NEW_CODE**
MASTER_ID SEQ_NO CODE_ID CODE
100 0 XX 1234
200 0 5555
300 2 Z1 1234
300 2 Z1 1234
这仍然会得到相同的结果,它只是更新Z1两次,因为我需要它将CODE_ID更新为Z1的第一行,然后查看第二行的MASTER_ID为300,CODE_ID为空,并且不在CODE_MAPPING表中。所以在预期的结果中,行的CODE_ID应该是Z1并且是空的。 – swingard
编辑我的答案,因为我需要格式化和很多字符。 –
谢谢光标正是我一直在寻找的! – swingard