提前感谢您的反馈。
我试图从连接中的条件更新列。
我可以使用SELECT
返回我想要的列,但UPDATE
语句不执行任何操作。
我尝试过这两种方式(见下文)。示例二嵌套SELECT
语句,该语句独立工作,返回12行,但是当我尝试更新列时,返回0行或返回2行。并且2行不是SELECT
语句中的行。如果需要,我会在以后追逐那只兔子,但是我想要一些反馈。
查询#1:
BEGIN TRAN
UPDATE lot_group
SET lot_group_code = 'Finished'
FROM inv_mast_lot i
LEFT JOIN lot_group l ON i.lot_group_uid = l.lot_group_uid
LEFT JOIN line o ON i.inv_mast_uid = o.inv_mast_uid
LEFT JOIN header h ON o.order_no = h.order_no
LEFT JOIN inventory m ON i.inv_mast_uid = m.inv_mast_uid
WHERE
l.lot_group IS NULL
AND o.cancel_flag <> 'Y'
AND o.company_no = 'db1'
AND o.complete <> 'Y'
AND o.delete_flag <> 'Y'
AND h.projected_order <> 'Y'
AND m.item_id = 'part_1')
ROLLBACK/COMMIT
查询#2:
BEGIN TRAN
UPDATE lot_group
SET lot_group_code = 'Finished'
WHERE EXISTS (SELECT l.lot_group_code, m.item_id, l.lot_group_uid
FROM inv_mast_lot i
LEFT JOIN lot_group l ON i.lot_group_uid = l.lot_group_uid
LEFT JOIN line o ON i.inv_mast_uid = o.inv_mast_uid
LEFT JOIN header h ON o.order_no = h.order_no
LEFT JOIN inventory m ON i.inv_mast_uid = m.inv_mast_uid
WHERE l.lot_group IS NULL
AND o.cancel_flag <> 'Y'
AND o.company_no = 'db1'
AND o.complete <> 'Y'
AND o.delete_flag <> 'Y'
AND h.projected_order <> 'Y'
AND m.item_id = 'part_1')
ROLLBACK/COMMIT
答案 0 :(得分:2)
首先,我将更改update语句以使用查询其余部分中使用的别名。接下来查看查询是否返回任何有用的内容,您可以嵌入注释掉的选择。这样,您可以只运行选择,直到您确定要获取要更新的数据,确保更新然后正确运行。另一种技术是运行select,运行更新,然后每次运行select回滚,直到得到正确的结果。我更喜欢做第一个,直到我很确定我正在选择正确的记录进行更新。然后转到第二种方法,以确保更新发生在我想象的那样。
UPDATE l
SET lot_group_code = 'Finished'
--select l.lot_group_code, *
FROM inv_mast_lot i
LEFT JOIN lot_group l
ON i.lot_group_uid = l.lot_group_uid
LEFT JOIN line o
ON i.inv_mast_uid = o.inv_mast_uid
LEFT JOIN header h
ON o.order_no = h.order_no
LEFT JOIN inventory m
ON i.inv_mast_uid = m.inv_mast_uid
WHERE l.lot_group IS NULL
AND o.cancel_flag <> 'Y'
AND o.company_no = 'db1'
AND o.complete <> 'Y'
AND o.delete_flag <> 'Y'
AND h.projected_order <> 'Y'
AND m.item_id = 'part_1')
答案 1 :(得分:2)
这只是搞砸了。
没有目的更新左连接的目标 null表示没有任何内容可以更新。
通过在where中添加条件来否定所有其他左连接。