使用 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
我尝试将使用 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