您是否允许在SQL CTE语句中执行存储过程?我对sql cte查询有点新...
嗨很多天我一直在研究MySQL中的这个问题,但我无法弄明白.你们有什么建议吗?
基本上,我有一个类别表,其域名包括:id,name(类别名称)和parent(类别的父ID).
示例数据:
1 Fruit 0
2 Apple 1
3 pear 1
4 FujiApple 2
5 AusApple 2
6 SydneyAPPLE 5
....
Run Code Online (Sandbox Code Playgroud)
有许多级别,可能超过3个级别.我想创建一个sql查询,根据他的层次结构对数据进行分组:parent> child> grandchild>等.
它应该输出树结构,如下所示:
1 Fruit 0
^ 2 Apple 1
^ 4 FujiApple 2
- 5 AusApple 2
^ 6 SydneyApple 5
- 3 pear 1
Run Code Online (Sandbox Code Playgroud)
我可以使用单个SQL查询执行此操作吗?我尝试过并且确实有效的替代方案如下:
SELECT * FROM category WHERE parent=0
Run Code Online (Sandbox Code Playgroud)
在此之后,我再次遍历数据,并选择parent = id的行.这似乎是一个糟糕的解决方案.因为它是mySQL,所以不能使用CTE.
在我的MySQL模式中,我有category(id, parentid, name)表
在MSSQL中,我有CTE查询(从下到上为所提供的类别ID构建一个类别树:
with CTE (id, pid, name)
as
(
select id, parentid as pid,name
from category
where id = 197
union all
select CTE.pid as id , category.parentid as pid, category.name
from CTE
inner join category
on category.id = CTE.pid
)
select * from CTE
Run Code Online (Sandbox Code Playgroud)
如何将该查询"转换"为MySQL?
一直坚持使用SQL2000太长时间了,我并没有真正接触过Common Table Expressions.
我在这里给出的答案(#4025380)和这里(#4018793)已经违背了流程,因为他们没有使用CTE.
我很感激,对于递归它们是beez kneez,并且有一些查询可以通过它们的使用大大简化,但在什么时候它们的使用只是轻浮?与子查询或联接相比,它们是否具有很好的性能优势?他们真的简化了代码并使其更易于维护吗?
简而言之,何时使用CTE而不是'较小'语法是一种好习惯.
sql-server maintainability performance common-table-expression
我想用分页进行数据库查询.所以,我使用了一个通用表表达式和一个排名函数来实现这一点.看下面的例子.
declare @table table (name varchar(30));
insert into @table values ('Jeanna Hackman');
insert into @table values ('Han Fackler');
insert into @table values ('Tiera Wetherbee');
insert into @table values ('Hilario Mccray');
insert into @table values ('Mariela Edinger');
insert into @table values ('Darla Tremble');
insert into @table values ('Mammie Cicero');
insert into @table values ('Raisa Harbour');
insert into @table values ('Nicholas Blass');
insert into @table values ('Heather Hayashi');
declare @pagenumber int = 2;
declare @pagesize int = 3;
declare @total int;
with …Run Code Online (Sandbox Code Playgroud) 我有一个非常胖的公用表表达式,其中包含行号,以便我可以返回分页结果集.我还希望在分页结果集之前返回与查询匹配的记录总数.
with recs as (select *, row_number() over (order by id) as rownum from ......)
select * from recs where rownum between @a and @b .... select count(*) from recs
Run Code Online (Sandbox Code Playgroud)
显然我上面的查询是不完整的,但它只是为了说明我的观点.我想要一页结果和匹配总数.如何在不必复制和粘贴整个20+线CTE的情况下完成此操作?
WITH子句和子查询之间有什么区别?
1. WITH table_name as ( ... )
2. select *
from ( select curr from tableone t1
left join tabletwo t2
on (t1.empid = t2.empid)
) as temp_table
Run Code Online (Sandbox Code Playgroud) 昨晚我写的是一个简单的T-SQL程序
DECLARE @ROLEID AS INT
SELECT @ROLEID = [ROLE ID] FROM TBLROLE
;WITH CTE
AS
(
SELECT * FROM SOMETABLE
)
IF (@ROLEID = 1)
BEGIN
//SOMECODE
END
ELSE IF(@ROLEID = 2)
BEGIN
//SOMECODE
END
ELSE
BEGIN
//SOMECODE
END
Run Code Online (Sandbox Code Playgroud)
我在编译后发现它抛出的错误类似于"如果附近有错误的语句"
怎么了?
但是,我通过使用其他方式做到了这一点.但我想知道为什么它不起作用!
sql t-sql sql-server sql-server-2005 common-table-expression
我有这个查询,但它不能正常工作,
with c as (select
month(bookingdate) as duration,
count(*) as totalbookings
from
entbookings
group by month(bookingdate)
),
d as (SELECT
duration,
sum(totalitems)
FROM
[DrySoftBranch].[dbo].[mnthItemWiseTotalQty] ('1') AS BkdQty
group by duration
)
select
c.duration,
c.totalbookings,
d.bkdqty
from
c
inner join d
on c.duration = d.duration
Run Code Online (Sandbox Code Playgroud)
当我跑这个,我得到了
Msg 8155,Level 16,State 2,Line 1
没有为'd'的第2列指定列.
谁能告诉我我做错了什么?
另外,当我跑这个,
with c as (select
month(bookingdate) as duration,
count(*) as totalbookings
from
entbookings
group by month(bookingdate)
),
d as (select
month(clothdeliverydate),
SUM(CONVERT(INT, deliveredqty))
FROM
barcodetable
where
month(clothdeliverydate) is …Run Code Online (Sandbox Code Playgroud) sql sql-server group-by calculated-columns common-table-expression
sql-server ×6
sql ×5
mysql ×2
oracle ×2
t-sql ×2
group-by ×1
pagination ×1
performance ×1
subquery ×1