【问题标题】:Updating Records in Table A based on Records in Table B根据表 B 中的记录更新表 A 中的记录
【发布时间】:2011-04-03 19:53:30
【问题描述】:

我必须编写一个语句,用综合生成的值填充表 (customers)。还有一个额外的约束,我应该只用特殊属性填充那些属性(列)(即正式对它们进行投影,然后专门对它们进行操作)。这些属性存储在第二个表中,attributes

我的初稿包含以下两个陈述:

-- Get the attributes (columns) we are interested in only
SELECT attributeID from attributes
WHERE tableID = 'customers'

-- Iterate over each row of customers, filling only those attributes (columns)
-- obtained by the above SELECT statement
UPDATE customers
   SET (use the records from above select statement...)

现在我的问题是如何将它们组合在一起。我知道有可能将 WHERE 子句附加到 SET 子句,但这会根据我的需要选择行,而不是列。我还阅读了有关PIVOT 的信息,但到目前为止只在一张桌子内,而不是两张,就像这里的情况一样。我会非常感谢任何提示,因为我不知道该怎么做。

【问题讨论】:

    标签: sql sql-update projection


    【解决方案1】:

    这不是您要找的吗? SQL Update Multiple Fields FROM via a SELECT Statement

    UPDATE
        Table
    SET
        Table.col1 = other_table.col1,
        Table.col2 = other_table.col2
    FROM
        Table
    INNER JOIN
        other_table
    ON
        Table.id = other_table.id
    

    【讨论】:

    • 这不是标准 SQL,所以请您说明您想到的 SQL 方言(SQL Server?)。
    • 不,它是标准的 ANSI-sql。我至少在 T-SQL 中测试过
    • 首先,感谢您的回答,对于我迟到的回复感到抱歉。问题是,要更新的列数事先不知道,因为这是属性表上 SELECT 的结果。与此同时,我们解决了这个问题,不尝试在纯 SQL 中执行,而是使用 Python 生成 SET 语句。有关这方面的更多详细信息,请参阅我对 onedaywhen 帖子的第二条评论。
    【解决方案2】:

    标准 SQL-92 需要标量子查询:

    UPDATE customers
       SET attributeID = (
                          SELECT A1.attributeID 
                            FROM attributes AS A1
                           WHERE A1.tableID = 'customers'
                         );
    

    不过,UPDATE customers...WHERE A1.tableID = 'customers'“闻起来”好像您将数据与元数据混合在一起。

    【讨论】:

    • 谢谢你的回答,@onedaywhen,请原谅我迟到的。我认为您的答案非常接近我的需要。然而,与此同时,我们通过放弃在纯 SQL 中执行此操作,而是使用 Python 生成 UPDATE 语句来解决这个问题。尝试在 SQL 中执行此操作时的主要困难是我们从属性表中获取的列数是事先不知道的。因此,可能会生成与您提出的声明类似的声明,请参阅下一条评论。
    • SET ( SELECT attributeID FROM attributes WHERE.tableID = 'customers' ) = ('AAAA', 'AA', ...); --值的数量必须等于左侧的属性数量
    • 虽然括号中的“左侧”用于定义要更新的列可能是可能的,但我们最近在努力如何使用 SQL 语句生成右侧的第二部分(“AAA”)只要。所以我们决定在 Python 中执行此操作,我们首先从属性表中获取要更新的属性列表。由于我们将这些作为 Python 列表获取,因此可以直接获取它具有的元素数量并生成上述 SQL SET 语句的两侧。所以,再次感谢您的帮助,希望这也能对您有所帮助。
    • ...您完全正确,我们将数据与元数据混合在一起。这是一个遗留问题,我们试图逐步消除它。
    猜你喜欢
    • 2023-03-20
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多