使用 CTE 而不是子查询

use CTE instead of subquery

我尝试将使用 subquery 的 SQL 查询重写为使用 common table expression (CTE) 的查询。前者如下

select accounting_id, object_code, 'active', name
from master_data md
where md.id in (
    select MIN(md1.id)
    from master_data md1
    where md1.original_type = 'tpl'
    group by md1.object_code
);

下面那个失败了

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near 'distinct_object_code_id' at line 9
with distinct_object_code_id(id) as (
    select MIN(md1.id)
    from master_data md1
    where md1.original_type = 'tpl'
    group by md1.object_code
) 
select md.accounting_id, md.object_code, 'active', md.name
from master_data md
where md.id in distinct_object_code_id;

这个也失败了

with distinct_object_code_id as (
    select MIN(md1.id)
    from master_data md1
    where md1.original_type = 'tpl'
    group by md1.object_code
) 
select md.accounting_id, md.object_code, 'active', md.name
from master_data md
join distinct_object_code_id using(id)
;

下面这个有效(通过明确指定 column_list)

with distinct_object_code_id(id) as (
    select MIN(md1.id)
    from master_data md1
    where md1.original_type = 'tpl'
    group by md1.object_code
) 
select md.accounting_id, md.object_code, 'active', md.name
from master_data md
join distinct_object_code_id using(id)
;

我尝试了另一个,但也失败了(在 CTE 中使用子查询)

with distinct_object_code_id as (
    select accounting_id, object_code, 'active', name
    from master_data md
    where md.id in (
        select MIN(md1.id)
        from master_data md1
        where md1.original_type = 'tpl'
        group by md1.object_code
)
select * from distinct_object_code_id;

MYSQL 数据库版本为 8.0.29-0ubuntu0.20.04.3
我在使用 CTE 时做错了什么?

编辑: 我添加了第三部分,其中我将上述查询中的数据插入到另一个 table tpl_transferred_debtor 中,如下所示

with distinct_object_code_id as (
    select MIN(id) as id
    from master_data
    where original_type = 'tpl'
    group by object_code
), 
tmp_tpl_table as (
    select md.accounting_id, md.object_code, 'active', md.name
    from master_data md
    join distinct_object_code_id using(id)
)
insert into tpl_transferred_debtor(debtor_id, tpl_code, status, description)
select * from tmp_tpl_table;

这个失败了

Error Code: 1064. You have an error in your SQL syntax; check the  manual that corresponds to your MySQL server version for the right   syntax to use near 'insert into tpl_transferred_debtor(debtor_id,   tpl_code, status, description) sel' at line 12  

我试着写了一个简单的来检查第二个 CTE tmp_tpl_table 没问题

with distinct_object_code_id as (
    select MIN(id) as id
    from master_data
    where original_type = 'tpl'
    group by object_code
), 
tmp_tpl_table as (
    select md.accounting_id, md.object_code, 'active', md.name
    from master_data md
    join distinct_object_code_id using(id)
)
select * from tmp_tpl_table;

您的第一个查询失败,因为您不能使用 IN 来引用您必须加入的 cte 或 IN 的正确语法,即 in (select..from cte) 您的第二个查询失败,因为您没有使用别名 MIN(md1.id) 您的第三个查询有效,因为您通过提供 (ID)

引用了 MIN(md1.id)

我个人更喜欢 join..on 而不是 join..using