我有三个表,我必须编写一个查询来更新表3中的表1行,而我唯一匹配的列在表2中。
表1中包含不正确的数据:
表3有正确的数据:
我确实尝试编写一个查询并执行它但是它给了我一个错误,说有太多的行也选择哪个是真的我有很多行要纠正但它仍然不会纠正。你觉得我应该怎么做。这是我目前的询问。
UPDATE Table1
SET Table1.Number = (SELECT Table3.Number
FROM Table2
FULL OUTER JOIN Table1 ON Table1.ID = Table2.ID
FULL OUTER JOIN Table3 ON Table3.Signin = Table2.Signin
WHERE (Table2.ID = Table1.ID)
AND (Table1.Number = 'xxx'))
WHERE (Tale1.Number = 'xxx')
答案 0 :(得分:2)
在JOIN查询的Where子句中需要修改,因为多个记录是由不适当的条件生成的。尝试使用Table3组件而不是在连接查询where子句时使用Table1。
UPDATE Table1
SET Table1.NUMBER = (SELECT table3.NUMBER FROM Table1 FULL OUTER JOIN Table2
ON Table1.ID = Table2.ID
FULL OUTER JOIN Table3
ON Table2.SIGNIN = Table3.SIGNIN
WHERE Table3.SIGNIN = 100) // This is the point where you need to modify your code
WHERE Table1.ID = 1;
答案 1 :(得分:1)
你很亲密。在进行更新时,除非您想要在t3中未匹配记录时清除t1.number的值,否则您将需要使用INNER JOIN
。 FULL OUTER JOIN
意味着您正在尝试更新t1中不存在但是LEFT JOIN
的行,如果t3中的记录不存在,则将t1.number更新为NULL。
UPDATE t1
SET t1.Number = t3.Number
FROM
Table1 t1
INNER JOIN Table2 t2
ON t1.Id = t2.Id
INNER JOIN Table3 t3
ON t2.Signin = t.3.Signin
WHERE
t1.number <> t3.number
--Or if you have nulls something like
--ISNULL(t1.number,'xxx') <> ISNULL(t3.number,'xxx')
-- if you only want to update when t1.number = 'xxx' then
--t1.number = 'xxx'
t1,t2,t3是我通过在表名后添加别名而创建的表别名。通过使用连接语法而不是子选择,您可以简化条件。在sql-sever中如果在t2&amp;中有超过1条记录t3匹配它将在一对多关系的情况下随机选择一行。如果你想要一个特定的记录而不是一对一的关系,你可以使用窗口函数和公用表表达式(cte)将t3限制为你想要使用的确切记录。
答案 2 :(得分:1)
在我从查询中删除此行后,它确实有效。
FULL OUTER JOIN Table1 ON table1.ID = Table2.ID
感谢您的帮助。