【问题标题】:One update SQL query from three tables三个表中的一个更新 SQL 查询
【发布时间】:2016-06-29 21:09:20
【问题描述】:

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

【问题讨论】:

  • 哪个rdbms(mysql、sql-server、oralce等)

标签: sql sql-server


【解决方案1】:

在JOIN查询的Where子句中,由于条件不合适生成了多条记录,需要修改。在join查询的where子句中,尽量使用Table3组件,而不是使用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;

ONLINE DEMO HERE

【讨论】:

  • @Nick 我根据您的最新编辑做了一些更改。看看这个。
  • 感谢您的帮助
【解决方案2】:

在我从查询中删除此行后,它实际上起作用了。

在 table1.ID = Table2.ID 上的表 1 完全外连接

感谢您的帮助。

【讨论】:

  • 看起来内部查询中的AND (Table1.Number = 'xxx') 是多余的。您使用完全外部联接是否有原因?
【解决方案3】:

你很接近。进行更新时,除非您想在 t3 中不匹配记录时清除 t1.number 的值,否则您将需要使用 INNER JOINFULL 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 & t3 中有超过 1 条记录匹配,它将在一对多关系的情况下随机选择一行。如果您在不是一对一关系时想要特定记录,您可以使用窗口函数和公用表表达式 (cte) 将 t3 限制为您要使用的确切记录。

【讨论】:

  • 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
相关资源
最近更新 更多