来自三个表的一个更新SQL查询

来自三个表的一个更新SQL查询,sql,sql-server,Sql,Sql Server,我有三个表,我必须编写一个查询来更新表3中表1的行,我仅有的匹配列在表2中 表1数据不正确: 表3提供了正确的数据: 我确实试着写一个查询并执行它,但它给我一个错误,说有太多的行太多选择这是真的,我有很多行要纠正,但它仍然不会纠正。你认为我该怎么办。这是我目前的疑问 UPDATE Table1 SET Table1.Number = (SELECT Table3.Number FROM Table2 FULL

我有三个表,我必须编写一个查询来更新表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')

你很接近。但在执行更新时,除非您希望在t3中记录不匹配时清除t1.number的值,否则您将希望使用内部联接。完全外部联接意味着您试图更新t1中不存在的行,但如果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是我通过在表名后添加别名创建的表别名。通过使用连接语法而不是子选择,可以简化WAR条件。在sql Server中,如果t2和t3中有多条记录匹配,则在一对多关系的情况下,它将随机选择一行。如果在非一对一关系时需要特定记录,则可以使用窗口函数和通用表表达式cte将t3限制为您要使用的确切记录。

在JOIN查询的Where子句中需要修改,因为多个记录是由不适当的条件生成的。在JOIN查询中,请尝试使用表3组件,而不是使用表1查询where子句

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;

在我从查询中删除这一行之后,它实际上起了作用

Table1.ID=Table2.ID上的完全外部联接Table1


感谢您的帮助。

哪个rdbms mysql、sql server、oralce等@Nick我根据您的最新编辑做了一些更改。检查此项。谢谢帮助谢谢帮助看起来像和表1。内部查询中的Number='xxx'是多余的。使用完全外部联接有什么原因吗?