【问题标题】:sql update multiple rows with subselectsql用子选择更新多行
【发布时间】:2012-06-30 13:33:40
【问题描述】:

我正在尝试将毕业期限表中的相应毕业日期值复制到 user_education_mba_school 表中具有匹配毕业期限 ID 的行中。这是我的非工作查询

TABLE DEFS
**user_education_mba_school
  school_id
  graduation_date
  graduation_term_id

**graduation_term
  graduation_term_id
  graduation_year_id
  graduation_date

**graduation_class
  graduation_class_id
  graduation_year_id  

**user
  user_id
  graduation_class_id

-- 多连接不起作用...

UPDATE  u
SET     graduation_class_id = gc.graduation_class_id
FROM    [user] u
JOIN    user_education_mba_school mba
ON      mba.user_id = u.user_id
JOIN    graduation_term gt
ON      mba.graduation_term_id = gt.graduation_term_id
JOIN    graduation_class gc
ON      gt.graduation_year_id = gc.graduation_year_id

【问题讨论】:

  • 你能解决这个错误吗?

标签: sql sql-update subquery


【解决方案1】:

有几个数据库支持update ... from语法,这点相当清楚:

UPDATE  mba
SET     graduation_date = gt.graduation_date
FROM    user_education_mba_school mba
JOIN    graduation_term gt
ON      gt.graduation_term_id = mba.graduation_term_id

如果您的数据库没有,请说明您使用的是哪个数据库。

【讨论】:

  • 我认为这行得通。这很优雅。我正在使用 SQL Server 2008。
  • 这里可以加入多个表吗?我有第二张表,同样需要以这种方式更新,但需要第二次加入。
  • 是的,您可以添加任意数量的联接。但是你只能更新一个表。
  • 在第二个查询中,join 只有在用户已经拥有u.graduation_class_id = gc.graduation_class_id 时才会成功。我不希望查询做很多事情?我建议提出一个新问题,也许以SQL Fiddle 为例。
  • 在毕业班中找到“正确”行的过程是什么?
【解决方案2】:

这是行不通的,因为您正在设置子查询的整个结果集

UPDATE user_education_mba_school SET graduation_date = (
  SELECT gt.graduation_date
  FROM user_education_mba_school mba, graduation_term gt
  WHERE gt.graduation_term_id = mba.graduation_term_id
)

这应该可以工作(未经测试)

UPDATE user_education_mba_school mba SET graduation_date = (
  SELECT gt.graduation_date
  FROM graduation_term gt
  WHERE gt.graduation_term_id = mba.graduation_term_id
)

【讨论】:

  • UPDATE 命令是否支持别名?至少在 SQL Server 中没有。
【解决方案3】:
UPDATE  mba
SET     graduation_date = gt.graduation_date, mba_graduation_year_id = gt.graduation_year_id
FROM    user_education_mba_school mba
JOIN    [sueldovista].dbo.graduation_term gt
ON      gt.graduation_term_id = mba.graduation_term_id


UPDATE  u
SET     graduation_class_id = gc.graduation_class_id
FROM    [user] u
JOIN    user_education_mba_school mba
ON      mba.user_id = u.user_id
JOIN    [sueldovista].dbo.graduation_term gt
ON      mba.graduation_term_id = gt.graduation_term_id
JOIN    [sueldovista].dbo.graduation_class gc
ON      gt.graduation_year_id = gc.graduation_year_id
WHERE   gc.site_instance_id = 1

【讨论】:

    【解决方案4】:

    甲骨文:

    UPDATE PRODUCTION a
    SET (name, count) = (
      SELECT name, count
      FROM STAGING b
      WHERE a.ID = b.ID);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多