我需要将两个连续的聚合函数应用于数据集(一系列平均值的总和),这可以通过SQL Server中的公共表表达式或支持CTE的其他DBMS轻松地例行完成.不幸的是,我目前仍然坚持使用不支持CTE的SQLite.是否有替代或解决方法在SQLite中实现相同的结果而不执行两个查询并在代码中汇总结果?
为了添加更多细节,我不认为可以通过视图轻松完成,因为需要根据带有多个参数的WHERE子句检索第一组聚合值.例如,
SELECT avg(elapsedTime)
FROM statisticsTable
WHERE connectionId in ([lots of values]) AND
updateTime > [startTime] AND
updateTime < [endTime]
GROUP BY connectionId
Run Code Online (Sandbox Code Playgroud)
然后我需要这些平均值的总和.
Common Table Expressions在我的查询中实现这个新想法:
SELECT ..... FROM .... WHERE ... IN
(
;with CTEName as
(
CTE syntax goes here
)
SELECT .... FROM CTEName
)
GROUP BY ....
Run Code Online (Sandbox Code Playgroud)
仍然收到以下查询错误:
Msg 102, Level 15, State 1, Line 4
Incorrect syntax near ';'.
Msg 102, Level 15, State 1, Line 14
Incorrect syntax near ')'.
Run Code Online (Sandbox Code Playgroud)
这是CTE的有效用法吗?
谢谢.
我有很多类似的结构表,如下所示:
CREATE TABLE [dbo].[tbl_Hierarchy](
[ID] [int] NOT NULL,
[ParentID] [int] NOT NULL,
[Text] [nvarchar](100) NOT NULL,
--other field irrelevant to my question
)
INSERT INTO dbo.tbl_Hierarchy VALUES(1,0,'parent1')
INSERT INTO dbo.tbl_Hierarchy VALUES(2,0,'parent2')
INSERT INTO tbl_Hierarchy VALUES(3,1,'child1')
INSERT INTO tbl_Hierarchy VALUES(4,3,'grandchild1')
INSERT INTO tbl_Hierarchy VALUES(5,2,'child2')
Run Code Online (Sandbox Code Playgroud)
你能帮我写一个包含两个带表名和ID参数的存储过程吗?
例如,执行时
EXEC usp_getChildbyID tbl_Hierarchy, 1
Run Code Online (Sandbox Code Playgroud)
结果集应该是:
ID Text Level
1 parent1 1
3 child1 2
4 grandchild1 3
Run Code Online (Sandbox Code Playgroud)
非常感谢提前.
sql-server stored-procedures hierarchical common-table-expression
我有这个SQL查询按月分组搜索:
; with Mth (st, nd) as (
select DATEADD (M, datediff (m, 0,'2012-09-01'), 0),
DATEADD (M, DATEDIFF (m, 0, '2012-09-01') + 1, 0)
union all
select DATEADD (m, 1, st),
DATEADD (m, 1, nd)
from Mth
where nd <= DATEADD (m, datediff (m, 0, getdate()), 0)
)
select MONTH(Mth.st) Month,
COUNT(S.QRY_ID) Searches
FROM Mth
LEFT JOIN SEARCHES S
on Mth.st <= S.CREATED
and Mth.nd > S.CREATED
GROUP BY YEAR(Mth.st), MONTH(Mth.st)
ORDER BY 1,2
Run Code Online (Sandbox Code Playgroud)
结果如下所示:
Month | Searches
---------------------
9 …Run Code Online (Sandbox Code Playgroud) 这个查询有什么问题:
WITH volcan AS (SELECT DISTINCT v.numturista
FROM viaje v, sitio s
WHERE v.numsitio = s.numsitio
AND s.tipo = 'Volcan'),
desierto AS (SELECT DISTINCT v.numturista
FROM viaje v, sitio s
WHERE v.numsitio = s.numsitio
AND s.tipo = 'Desierto')
SELECT DISTINCT pais
FROM turista
WHERE numturista IN (volcan INTERSECT desierto);
Run Code Online (Sandbox Code Playgroud)
它不应该等同于以下(因为WITH创建命名的SELECT查询):
SELECT DISTINCT pais
FROM turista
WHERE numturista IN (
(SELECT DISTINCT v.numturista
FROM viaje v, sitio s
WHERE v.numsitio = s.numsitio
AND s.tipo = 'Volcan')
INTERSECT
(SELECT DISTINCT v.numturista
FROM …Run Code Online (Sandbox Code Playgroud) sql postgresql common-table-expression intersect relational-division
我有一个(可能)基本问题,关于Postgres如何执行包含WITH子句的查询.我想知道在WITH子句中包含多余的表是否会减慢查询速度.也就是说,如果在WITH子句中创建的"临时"表永远不会在子句之外调用WITH,那么实际创建的是"临时"表吗?
在第一个例子中,我正在加入两个使用WITH子句创建的"临时"表:
--Example 1
WITH temp1 as (
SELECT * from table_1
),
temp2 as (
select * from table_2
)
select *
from temp1
join temp2;
Run Code Online (Sandbox Code Playgroud)
在第二个例子中,我正在执行完全相同的查询,除了在WITH子句中创建了一个无关的表"temp3" .
--Example 2
WITH temp1 as (
SELECT * from table_1
),
temp2 as (
select * from table_2
),
temp3 as (
select * from table_3
)
select *
from temp1
join temp2;
Run Code Online (Sandbox Code Playgroud)
这两个查询之间有任何性能差异吗?如果table_3是一个巨大的表,这会减慢示例2与示例1中的查询吗?如果没有,为什么不呢?
好像它不会影响查询时间.我仍然很好奇为什么,尽管......
sql postgresql common-table-expression postgresql-performance
我有一个使用Common Table Expressions的递归查询,它获取开始日期和结束日期之间的日期范围
WITH T(date) AS (
SELECT @StartDate UNION ALL
SELECT DateAdd(day,1,T.date) FROM T WHERE datediff(dd,T.date , @EndDate)>0 )
SELECT date FROM T OPTION (MAXRECURSION 32767))
Run Code Online (Sandbox Code Playgroud)
有没有办法让我在没有创建临时表的情况下将其嵌套在另一个select语句中?
我正在寻找这样的声明
select * from (WITH T(date) AS (
SELECT @StartDate UNION ALL
SELECT DateAdd(day,1,T.date) FROM T WHERE datediff(dd,T.date , @EndDate)>0 )
SELECT date FROM T OPTION (MAXRECURSION 32767)))
join
(select * from SomeTable where MyDate between @StartDate and @EndDate)
on //Some condition
Run Code Online (Sandbox Code Playgroud)
我在SQL Server中尝试了这个,并且有一个
WITH附近的语法不正确
错误被抛出.
根据定义,CTE仅存在于查询范围内.那么,是否有必要使用临时表来存储CTE的结果,或者上述方案是否也有效?
我是SQL Server 2012的新手,我正在尝试创建一个应该存储的存储过程:
但是我需要使用CTE来表现性能和其他原因(请不要挂断,我必须,只需听取我的意见).
如果CTE查询在存储过程中本身就可以正常工作,但是我不能让SP使用两个子句.
我在尝试创建程序时遇到错误,抱怨我应该在CTE之前使用分号.如果我添加分号,SQL Server也会抱怨它.这让我疯了,请帮忙!
我要删除/插入的表:
CREATE MYTABLE ( APPUSER NVARCHAR(15), DATA NVARCHAR(100) )
Run Code Online (Sandbox Code Playgroud)
简化的存储过程(无分号):
CREATE PROCEDURE P1 ( @SOMEUSER NVARCHAR(15), @TYPE INTEGER) AS
BEGIN
DELETE FROM MYTABLE WHERE ( APPUSER=@SOMEUSER )
WITH CTE AS (
SELECT DATA
FROM SOURCETABLE
WHERE ( TYPE = @TYPE )
)
INSERT INTO MYTABLE
SELECT
@SOMEUSER,
DATA
FROM CTE
END
Run Code Online (Sandbox Code Playgroud)
没有分号的错误消息:
[错误代码:319,SQL状态:S1000]关键字'with'附近的语法不正确.如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号终止先前的语句.
请注意,即使这是实际查询的简化版本,错误也完全相同.我没试过上面的代码,没有任何运气:(
带分号的存储过程(与上面相同的查询,为简洁起见仅显示分号):
(...)
BEGIN
DELETE FROM MYTABLE WHERE ( APPUSER=@SOMEUSER ); /* …Run Code Online (Sandbox Code Playgroud) t-sql sql-server stored-procedures common-table-expression sql-server-2012
我正在尝试编写一个递归CTE,它引用了之前编写的另一个CTE.
第一CTE nodes我已经封闭了与分号写递归前HierarchyCTE:
WITH nodes(node, node_name, parent, parent_name) AS
(
SELECT
Grp.PermissionGroupID as node,
Grp.GroupName as node_name,
GrpLink.ParentPermissionGroupID as parent,
ParentGrp.GroupName as parent_name
FROM _CCC_Permission_Group Grp
LEFT JOIN _CCC_Permission_GroupGroup GrpLink
on Grp.PermissionGroupID = GrpLink.ChildPermissionGroupID
LEFT JOIN _CCC_Permission_Group ParentGrp
on GrpLink.ParentPermissionGroupID = ParentGrp.PermissionGroupID
);
WITH Hierarchy(node, node_name, depth, parent, parent_name)
AS
(
SELECT
node,
node_name,
0,
parent,
parent_name
FROM nodes as FirstDepth
WHERE parent IS NULL
UNION ALL
SELECT
NextDepth.node,
NextDepth.node_name,
Parent.depth + 1,
Parent.parent,
Parent.parent_name
FROM nodes …Run Code Online (Sandbox Code Playgroud) 我有这样的桌子
ID Name Parent Code
----------------------------------
1 Item1 NULL K123
2 Item2 NULL K324
3 Item3 1 NULL
4 Item4 2 NULL
5 Item5 3 NULL
6 Item6 5 NULL
7 Item7 4 NULL
8 Item8 NULL K567
9 Item9 8 NULL
10 Item10 NULL NULL
---------------------------------
Run Code Online (Sandbox Code Playgroud)
我需要像这样从其父代继承所有子代的代码
ID Name Parent Code
----------------------------------
1 Item1 NULL K123
2 Item2 NULL K324
3 Item3 1 K123
4 Item4 2 K324
5 Item5 3 K123
6 Item6 5 K123
7 Item7 4 …Run Code Online (Sandbox Code Playgroud) sql ×7
sql-server ×4
t-sql ×3
postgresql ×2
hierarchical ×1
intersect ×1
pivot ×1
select ×1
sqlite ×1