【问题标题】:update each row in a procedure更新过程中的每一行
【发布时间】:2010-12-15 02:36:39
【问题描述】:

我在表 TABLE1 中有以下数据

文档 ------ FIELD1
12345
23456
34567
45678
98765

我在视图 VIEW1 中有以下数据

文档 ---- 巴士
12345 ------------ 5
23456 ------------ 6
34567 ------------ 8
45678 ------------ 12
98765 ------------ 14

我想做的是更新每一行

如果 (table1.document = view1.document)
然后 table1.field1 = view1.bus

任何见解都会有所帮助。

谢谢。

【问题讨论】:

    标签: sql procedure


    【解决方案1】:

    这可以使用纯 SQL 完成,无需任何程序:

    UPDATE table1 SET field1 = (SELECT bus FROM view1 WHERE table1.document = view1.document)
    

    或者,如果您的数据库允许:

    UPDATE (select table1.field1, view1.bus FROM table1 JOIN view1 ON table1.document = view1.document) SET table1.field1 = view1.bus
    

    【讨论】:

    • 谢谢。我尝试过“为每一行”,选择不同的更新子句。没有任何效果。非常感谢。
    【解决方案2】:

    正如 Dan 所说,但在 MS SQL Server 中,我发现这种样式更易于阅读:

    更新你 SET U.field1 = V.bus 从表 1 作为 U 加入视图 1 作为 V ON V.document = U.document

    请注意,如果 VIEW1 对于给定的 TABLE1 行 [DOCUMENT] 值可能有多个行,则选择用于更新 TABLE1 的 [BUS] 值将是随机的,在匹配集中。 (如果是这种情况,可以修改查询以选择 MAX / MIN / 等)

    我会优化这个查询,以不更新任何已经匹配 BUS 值的行,如果重新运行它会使其更快,因此 TABLE1 中已经存在一些值

    更新你 SET U.field1 = V.bus 从表 1 作为 U 加入视图 1 作为 V ON V.document = U.document 其中 U.field1 = V.bus 或(U.field1 不为空且 V.bus 为空) 或(U.field1 为空且 V.bus 不为空)

    如果字段被定义为不允许 NULL,您可以省略 NULL / NOT NULL 测试。

    【讨论】:

    • 这是 sql server 中的无效语法。你测试了吗?在这里检查正确的stackoverflow.com/a/21000449/4795214(简而言之:你不能在第一行使用别名 U,你必须重复 table1
    • 那不正确,你测试了吗?您绝对可以在 SQL Server 中执行 UPDATE AliasName SET ... FROM MyTable AS AliasName - 链接到文档:msdn.microsoft.com/en-us/library/ms177523.aspx
    • 是的,没错。我测试了它。请编辑您的答案,以便我可以删除我的反对票:)
    • 要么我误解了你的描述,要么你不正确。这是使用别名的 UPDATE 示例,根据文档 CREATE TABLE table1 (ID int, field1 varchar(10)); INSERT INTO table1 VALUES(1, 'xxx'); UPDATE U SET field1 = 'YYY' FROM table1 AS U; SELECT * FROM table1;
    • 我的意思是我之前的评论你是对的,我错了:) 我请你编辑你的答案,以便我可以删除我愚蠢的反对票:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多