我的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%。
希望有人能够理解我上面描述的内容:)谢谢
答案 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;