SQL - 是不是可以在单个查询中执行此操作?
Posted
技术标签:
【中文标题】SQL - 是不是可以在单个查询中执行此操作?【英文标题】:SQL - is it possible to do this in single query?SQL - 是否可以在单个查询中执行此操作? 【发布时间】:2013-08-29 13:09:03 【问题描述】:我的 sql 查询有问题 (SQL Server) 我有两张表 - 人员和帐户 人员有字段 - id、account_id、person_type(可以按 A、B、C、D 帐户有字段 - id、account_type(现在为 null,可以按 X 或 Y)
有 2000 个帐户,但 person 表有 3500 条记录。例如,person 表可以保存 3 条 account_id 相同但 person_type 不同的记录 这是我想要的: 基于人员表更新(在一个查询中)帐户表 - 在这一点上这似乎很容易。如果人员类型是 A、B、C,则将 X 放入帐户类型,如果 D 放入 Y。但是如果人员表包含 B 的人和 D 的不同人以及相同的 accont_id,我想将 Y 放入帐户中,我不知道如何执行它...
现在,我为每个循环都有一个 ssis,它正在迭代每个 account_id 并检查类型,但它的效率非常低,并且占用了我整个过程的大约 80%。
希望有人能理解我上面描述的内容:) 谢谢
【问题讨论】:
您能否提供一些示例数据和预期结果以更好地阐明您的问题? 听起来像一个简单的 JOIN 会做你想要的,但需要更多关于表和预期的信息来给出答案。也许发布 SSIS。 也许是 if/then/else 部分的一个案例。 问题由下面的人解决了,所以我不会发布示例数据:) 这里的关键元素是 with 子句 - 我以前不知道。 【参考方案1】:试试下面的。您需要对 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;
【讨论】:
谢谢!这就是我需要的:)【参考方案2】:对于单个查询,您需要根据 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
这是假设您正在使用/想要使用查询/存储过程。
【讨论】:
以上是关于SQL - 是不是可以在单个查询中执行此操作?的主要内容,如果未能解决你的问题,请参考以下文章