标签: common-table-expression

SQLite中的公用表表达式功能

我需要将两个连续的聚合函数应用于数据集(一系列平均值的总和),这可以通过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)

然后我需要这些平均值的总和.

sqlite common-table-expression

2
推荐指数
1
解决办法
5196
查看次数

SQL选择:使用CTE作为IN子句的数据集 - 语法错误

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的有效用法吗?
谢谢.

sql select sql-server-2005 common-table-expression

2
推荐指数
1
解决办法
962
查看次数

如何使用CTE在SQL Server 2005中使用存储过程从分层数据中获取所有子项及其自身

我有很多类似的结构表,如下所示:

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

2
推荐指数
1
解决办法
8208
查看次数

SQL如何使用公用表表达式和动态SQL来PIVOT表

我有这个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)

sql t-sql sql-server pivot common-table-expression

2
推荐指数
1
解决办法
5895
查看次数

将INTERSECT与WITH子句中的表一起使用

这个查询有什么问题:

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

2
推荐指数
1
解决办法
2829
查看次数

在WITH子句中添加无关表是否会减慢PostgreSQL中的查询速度?

我有一个(可能)基本问题,关于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

2
推荐指数
2
解决办法
2468
查看次数

在一个select语句中嵌套With子句

我有一个使用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 sql-server common-table-expression

2
推荐指数
1
解决办法
1285
查看次数

在SQL Server 2012中的存储过程中执行多个语句和CTE?

我是SQL Server 2012的新手,我正在尝试创建一个应该存储的存储过程:

  1. 然后,根据参数从表中删除先前的数据
  2. 在该表上插入新数据.

但是我需要使用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

2
推荐指数
1
解决办法
3万
查看次数

CTE和关闭半冒号

我正在尝试编写一个递归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)

sql t-sql common-table-expression

2
推荐指数
1
解决办法
490
查看次数

获取顶级父级ID继承给SQL中的所有子级

我有这样的桌子

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 common-table-expression sql-server-2012

2
推荐指数
1
解决办法
36
查看次数