我有一个UPDATE命令的问题,我得到错误
无法绑定多部分标识符“Day_settings.temp” .
尝试从左连接访问列值时 . 选择时,它工作正常 .
例如:
SELECT *
FROM Animals
LEFT JOIN Day_settings ON Animals.fk_day_id = Day_settings.id
LEFT JOIN Night_settings ON Animals.fk_night_id = Night_settings.id
这按预期工作 . 它在获取值时也有效,如下所示:
SELECT Day_settings.temp, Night_settings.temp
FROM Animals
LEFT JOIN Day_settings ON Animals.fk_day_id = Day_settings.id
LEFT JOIN Night_settings ON Animals.fk_night_id = Night_settings.id
更新时问题到了 . 我试过通过阅读其他stackoverflow问题来解决这个问题,但没有一个解决方案有效 . 使用 dbo.tablename
或在每个JOIN语句无效后编写选择器 .
命令如下:
UPDATE Animals
SET Animals.title = @title,
Animals.is_active = @is_active,
Day_settings.temp = @day_settings_temp,
Day_settings.humid = @day_settings_humid,
Day_settings.light = @day_settings_light,
Day_settings.time = @day_settings_time,
Night_settings.temp = @night_settings_temp,
Night_settings.humid = @night_settings_humid,
Night_settings.light = @night_settings_light,
Night_settings.time = @night_settings_time
FROM Animals
LEFT JOIN Day_settings ON Animals.fk_day_id = Day_settings.id
LEFT JOIN Night_settings ON Animals.fk_night_id = Night_settings.id
WHERE Animals.id = @id
它似乎遵循我在网上找到的所有示例的顺序和语法 .
任何帮助将非常感激,我真的迷路了 .
3 回答
您一次只能更新一个表 . 你似乎想要:
笔记:
如果您希望它们全部生效,您可以将它们包装在事务中"at the same time" .
表别名使查询更易于编写和读取 .
我删除了
SET
中的别名 . 它们是允许的,但由于只能更新一个表,我认为这可能会令人困惑 .LEFT JOIN
是没有必要的 . 您需要在第二个表中使用匹配的行来执行更新 .您是否尝试同时更新3个表?
我认为你只能1比1更新表格
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/eab6e48d-d22a-4e1f-add6-aaf3b47bdd84/how-to-update-multiple-tables-in-sql-server-2008-?forum=transactsql
每个语句只能更新1个表(除非您启用了触发器) . 你的开始
UPDATE
如此说:如果您没有更新用于过滤条件(或更新表达式)的连接字段或字段,则可以重复相同的连接以更新不同
UPDATE
语句上的每个表:由于这似乎是一个事务操作,您可能希望确保正确完成所有3个更新,或者没有一个更新 . 使用
TRANSACTION
换行更新,如果没有,请确保COMMIT
,否则确保ROLLBACK
. 这是一个简单的事务处理示例: