0

我的 sql 查询(SQL Server)有问题 我有两个表 - 个人和帐户 个人有字段 - id、account_id、person_type(可以按 A、B、C、D 帐户有字段 - id、account_type (现在为空,可以按 X 或 Y)

有 2000 个帐户,但 person 表有 3500 条记录。例如,person 表可以保存 3 条具有相同 account_id,但 person_type 不同的记录这就是我想要的:基于 person 表更新(在一个查询中)accounts 表 - 这在那时似乎很容易。如果人员类型是 A、B、C,则将 X 放入帐户类型,如果 D 放入 Y。但是如果人员表包含 B 的人和 D 的不同人以及相同的 accont_id,我想将 Y 放入帐户中,我不知道如何执行它...

现在,我为每个循环都有一个 ssis,它迭代每个 account_id 并检查类型,但它的效率非常低,并且占用了我整个过程的 80%。

希望有人能理解我上面描述的内容:)谢谢

4

2 回答 2

0

对于单个查询,您将需要基于 select 语句的更新。我发现 MERGE 语句是最好的(唯一的?)方法。对于您的 if 语句,您可以使用 CASE:

MERGE INTO accounts
USING
(
    SELECT accounts.id,
           CASE WHEN person_type in ('A', 'B', 'C')
                THEN 'X'
                WHEN person_type = 'D'
                THEN 'Y'
                ELSE 'Z' -- Included as example of the ELSE statement
           END AS account_type
    FROM accounts
    JOIN persons on accounts.id = persons.account_id
) updateTable ON accounts.id = updateTable.id
WHEN MATCHED THEN
    SET accounts.account_type = updateTable.accountType

这是假设您正在使用/想要使用查询/存储过程。

于 2013-08-29T13:40:27.877 回答
0

试试下面的。您需要对 account_id 上的人员记录进行分组,并在任何人的 person_type = “D”的情况下使“Y”覆盖“X”。您可以使用 CTE 执行此操作,然后将其加入帐户表以执行更新。

;WITH AccountTypes AS (
    SELECT  account_id
            , MAX(CASE WHEN person_type = 'D' THEN 'Y' ELSE 'X' END) AS account_type
    FROM    persons
    GROUP BY account_id
)
UPDATE  a
SET     a.account_type = at.account_type
FROM    accounts a
        JOIN AccountTypes at ON a.account_id = at.account_id;
于 2013-08-29T14:36:16.930 回答