SQL - 可以在单个查询中执行此操作吗?

时间:2013-08-29 13:09:03

标签: sql sql-server if-statement

我的sql查询有问题(SQL Server) 我有两张桌子 - 人和账户 人有字段 - id,account_id,person_type(可以通过A,B,C,D 帐户有字段 - id,account_type(现在为空,可以是X或Y)

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

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

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

2 个答案:

答案 0 :(得分:0)

对于单个查询,您需要根据选择参数进行更新。我发现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

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

答案 1 :(得分: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;