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 - 是不是可以在单个查询中执行此操作?的主要内容,如果未能解决你的问题,请参考以下文章

bigquery 命令行在单个 sql 文件中执行多个查询

oracle sql (toad) - 执行多个查询,保存到单个 excel 文件

组合查询

SQL 在单个查询中更新和选择

在单个查询中使用多个联接

一次向多个表添加新字段?