我需要更新引用两个表的表。带有2个连接的更新表
这是我选择的代码来验证哪些行将被更新。
SELECT *
FROM txsh AS t1
INNER JOIN div AS t2 ON t2.store = t1.ro_no
INNER JOIN temp_db AS t3 ON t3.bpn = t1.sku_id
AND (t3.div IS NULL OR t3.div = t2.div)
AND (t3.s_num IS NULL OR t3.s_num = t1.ro_no)
这是我加入3代表的结果。列'div'来自表格div,其依赖于ro_no,而'bpn,s_num,created_by'来自表格temp_db。
现在我想从我的选择代码中更新所有选定的行。这是我的更新代码。
UPDATE txsh
SET price = '0'
FROM txsh AS t1
INNER JOIN temp_db AS t2 ON t1.sku_id = t2.bpn
CROSS JOIN div AS t3
CROSS JOIN txsh
WHERE (t2.div IS NULL OR t3.div = t2.div)
AND (t2.s_num IS NULL OR t2.s_num = t1.ro_no)
我有三个更新实例。这取决于temp_db(BPN,s_num,DIV)
- 如果s_num和DIV为空,更新txsh其中sku_id = BPN
- 如果s_num不是null格为空,更新txsh其中sku_id = BPN和ro_no = s_num
- 如果s_num为空且div不为空,则更新txsh其中,表div [t2]的sku_id = bpn和[ro_no]的div值等于temp_db的[div]值。
我在想这个错误是在实例[3]上。例如[3]有什么方法纠正我的where子句?
你为什么要加入txsh?如果你删除这个交叉连接并将UPDATE更改为“t1”,那么你的查询是否工作? –
我会更明确地说明这一点。如果你很高兴你的第一个查询按照预期工作,那么只需从它的开头删除“SELECT *”,用“UPDATE txsh SET price ='0'”取代它,你应该很好。一个CROSS JOIN只会返回该表中的每一行,所以你的第二个查询将更新txsh中的每条记录,其余的查询完全是多余的,并且无论如何都可能被优化器忽略。 –
两个完全不同的查询具有不同的结果是完全正常的。现在如果相同的确定性查询返回不同的结果,那么这将是意想不到的。 –