【问题标题】:Update multi row with 1 FK key使用 1 个 FK 键更新多行
【发布时间】:2015-10-13 14:35:15
【问题描述】:
UPDATE LoanAccount
SET LoanAmount = (
        SELECT ((la.LoanAmount * (DATEDIFF(DAY, la.LoanDate, GETDATE()) * (la.InterestRate / la.LoanTerm)))) + la.LoanAmount
        FROM Customer c, LoanAccount la
        WHERE c.Customer_ID = la.Customer_ID
            AND c.AccountNumber = 213451
        )
    , LoanDate = GETDATE()
WHERE Customer_ID = 2;

我无法为 ID=2 的客户更新所有 LoanAmount, 这是消息

子查询返回超过 1 个值。这是不允许的,当 子查询遵循 =、!=、、>= 或当子查询用作 一个表达式。

任何解决方案

【问题讨论】:

  • 子查询不能返回多于一行。 (也许您也想确保子选择中的 Customer_ID=2?)
  • 是的,我在 LoanAccount 表中有 4 行 Customer_ID=2,我想更新该客户的所有金额,一个客户可以在我的项目中拥有多个贷款账户。

标签: sql sql-server


【解决方案1】:

这是因为下面的子查询返回不止一行。

SELECT ((la.LoanAmount * (DATEDIFF(DAY, la.LoanDate, GETDATE()) * (la.InterestRate / la.LoanTerm)))) + la.LoanAmount
FROM Customer c, LoanAccount la
WHERE c.Customer_ID = la.Customer_ID
    AND c.AccountNumber = 213451;

这应该是正确的语法:

UPDATE LA
SET LA.LoanAmount = ((LA.LoanAmount * (DATEDIFF(DAY, LA.LoanDate, GETDATE()) * (LA.InterestRate / LA.LoanTerm)))) + LA.LoanAmount
    , LA.LoanDate = GETDATE()
-- SELECT *
FROM dbo.LoanAccount AS LA
INNER JOIN dbo.Customer AS C
    ON C.Customer_ID = LA.Customer_ID
WHERE C.Customer_ID = 2
    AND C.AccountNumber = 2;

另外,请避免使用旧的连接语法,因为它已被弃用。 This question 深入讨论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多