标签: common-table-expression

CTE是存储的(如表)还是每次需要时都创建它?(SQL Server 2005)

之前从未使用过MS SQL Server,CTE对我来说是新手.但这正是我刚刚开始的项目所需要的.

有一张看起来像的桌子

TABLE group (
 'id' int,
 'parentId' int,
 'groupName' varchar(255)
)
Run Code Online (Sandbox Code Playgroud)

所以我有一个动态页面,根据get参数,"Group"我想要返回此组以下的所有内容.我很确定我可以设法为它编写CTE并使用它.

但是每次我想使用它时我都会创建它吗?(基本上连接到DB,运行CTE的设置,然后使用在此运行的查询).或者,一旦它们被创建并准备好随时使用,它们是否存储在数据库中?

如果存储它们,是否有类似sp_tables等的命令来显示它们/它们?因为如果它们被保存在那里可能已经存在执行此操作的查询.

sql sql-server-2005 common-table-expression

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

TSQL CTE错误:')附近的语法不正确

我正在使用SSMS 2008开发TSQL存储过程,并在生成CTE时收到上述错误.我想为此SP添加逻辑以返回每天,而不仅仅是数据的日子.我该怎么做呢?到目前为止,这是我的SP:

ALTER Proc [dbo].[rpt_rd_CensusWithChart]
   @program uniqueidentifier = NULL,
   @office uniqueidentifier = NULL
AS
DECLARE @a_date datetime
SET @a_date = case when MONTH(GETDATE()) >= 7 THEN '7/1/' + CAST(YEAR(GETDATE()) AS VARCHAR(30))
ELSE '7/1/' + CAST(YEAR(GETDATE())-1 AS VARCHAR(30)) END

if exists (
    select  * from tempdb.dbo.sysobjects o    where o.xtype in ('U')  and o.id = object_id(N'tempdb..#ENROLLEES')
) DROP TABLE #ENROLLEES;
if exists (
    select  * from tempdb.dbo.sysobjects o    where o.xtype in ('U')  and o.id = object_id(N'tempdb..#DISCHARGES')
) DROP TABLE #DISCHARGES;

declare @sum_enrollment …
Run Code Online (Sandbox Code Playgroud)

t-sql common-table-expression sql-server-2008

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

为什么说我的CTE查询中的RowId是无效列?

我有一个基于一些在线示例编写的CTE查询,不知道为什么我收到有关RowId的错误:

DECLARE @StartRow INT
DECLARE @EndRow INT
SET @StartRow = 120
SET @EndRow = 140

;WITH MyCTE AS
(
    SELECT 
        c1, c2, c3,
        ROW_NUMBER() OVER(ORDER BY gav.c1) AS RowId
    FROM 
        MyTable1 gav
)
SELECT *
FROM MyTable1 
WHERE RowId > @StartRow
  AND RowId < @EndRow
ORDER BY c1
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

消息207,级别16,状态1,行15
无效的列名称'RowId'.
消息207,级别16,状态1,行16
无效的列名称'RowId'.

在我看到的每个例子中,它们RowId在查询中引用了CTE 的值,但由于某些原因它似乎不在范围内?

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

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

如何通过多个联合语句的结果进行排序?

我不能使用公用表表达式:

WITH    cte
          AS (SELECT    [StationID],
                        [LastDistribution]
              FROM      [DB1].[dbo].[ProcessingStations]
              UNION ALL
              SELECT    [StationID],
                        [LastDistribution]
              FROM      [DB2].[dbo].[ProcessingStations]
              UNION ALL
              SELECT    [StationID],
                        [LastDistribution]
              FROM      [DB3].[dbo].[ProcessingStations]
              UNION ALL
              SELECT    [StationID],
                        [LastDistribution]
              FROM      [DB4].[dbo].[ProcessingStations]
              UNION ALL
              SELECT    [StationID],
                        [LastDistribution]
              FROM      [DB5].[dbo].[ProcessingStations]
              ORDER BY  [StationID]
              UNION ALL
              SELECT    [StationID],
                        [LastDistribution]
              FROM      [DB6].[dbo].[ProcessingStations]
              UNION ALL
              SELECT    [StationID],
                        [LastDistribution]
              FROM      [DB7].[dbo].[ProcessingStations]
              UNION ALL
              SELECT    [StationID],
                        [LastDistribution]
              FROM      [DB8].[dbo].[ProcessingStations])
    SELECT  *
    FROM    cte
    ORDER BY StationID
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

sql sql-server sql-order-by common-table-expression sql-server-2008

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

从记录类型的单列中拆分/提取值,将用户定义的函数应用于多行 CTE

使用 PostgreSQL 9.2,我定义了一个函数,它接受一个参数并返回一个多列表。我想将该函数应用于 CTE 行中的多个参数。我得到的结果是一列元组,而不是我想要的多列。以机智:

sandbox=# CREATE FUNCTION myfunc(arg int) RETURNS table(col1 int, col2 int) AS
sandbox-# 'SELECT arg+1, arg+2'
sandbox-# LANGUAGE SQL;
CREATE FUNCTION
sandbox=# select * from myfunc(1);
 col1 | col2 
------+------
    2 |    3
(1 row)

sandbox=# WITH rows AS (
sandbox(#   SELECT 1 AS arg UNION SELECT 2 AS arg
sandbox(# )
sandbox-# SELECT * FROM (SELECT myfunc(arg) FROM rows) x;
 myfunc 
--------
 (2,3)
 (3,4)
(2 rows)
Run Code Online (Sandbox Code Playgroud)

给定 CTE,以下两个SELECT子句作为具有单个类型列的表彼此评估相同record

SELECT myfunc(arg) FROM …
Run Code Online (Sandbox Code Playgroud)

sql postgresql user-defined-functions common-table-expression

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

包含针对OLEDB提供程序运行的CTE的查询在一台计算机上失败但在另一台计算机上运行

我有以下VBScript代码在我的计算机上运行得很好(Windows 7 SP1)但无法在另一台计算机上运行(Windows XP SP3):

Dim objConn 'adodb connection object
Dim objRS 'adodb recordset object
Dim strQuery
Const adOpenStatic = 3
Const adLockReadOnly = 1
Set objConn = CreateObject("ADODB.Connection")
Set objRS = CreateObject("ADODB.Recordset")
objConn.Open "Provider=sqloledb;Data Source=" & strDBServer & ";Initial Catalog=BromsunInfo;Integrated Security=SSPI;"

strQuery = _
    "WITH CMSRATES AS " & _
    "( " & _
    "SELECT h.EMPL_UNO, h.employee_code, r.rate 'Rate', r.eff_date 'Eff Date' " & _
    "FROM " & strCMSDBServer & ".cmsopen.dbo.hbm_persnl h, " & strCMSDBServer & _
    ".cmsopen.dbo.tbm_persnl p, …
Run Code Online (Sandbox Code Playgroud)

sql-server oledb adodb common-table-expression sql-server-2008

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

为什么我不能在此查询中使用WITH(公用表表达式)?

这只是一个SSCCE:

CREATE TABLE test(i INTEGER NOT NULL);

WITH max_i AS (SELECT MAX(i) FROM test)
SELECT * FROM test WHERE max_i - i < 2 AND max_i!=i
Run Code Online (Sandbox Code Playgroud)

PostgreSQL抱怨:

ERROR: column "max_i" does not exist
Run Code Online (Sandbox Code Playgroud)

我想这是因为max_i只有一个值,而不是一个行集,但我怎么弄,每当它们被用来在我经历复杂的查询,而不必重复子查询获得我的查询值仅一次定义?

sql postgresql common-table-expression

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

如何在 MySQL 中重用一个巨大的查询

我有非常大的查询,它从许多表中获取数据并按所有非计算列对它们进行分组。我需要多次重用这个查询,但需要进行其他分组和过滤。在 MSSQL 中,我为此目的使用 CTE 或临时表,但 MySQL 不支持 CTE,并且我不能在同一个查询中多次引用临时表(这是 MySQL 的可悲和不合逻辑的限制)。

SELECT 
    t1.VideoId, 
    t1.RegionId, 
    t1.CountryId, 
    t1.PerCountryCount,
    t2.PerRegionCount
FROM (
    SELECT 
        VideoId, 
        RegionId, 
        CountryId, 
        SUM(PlayCount) PerCountryCount
    FROM TrackedData
    GROUP BY VideoId, RegionId, CountryId
) t1
INNER JOIN (
    SELECT 
        VideoId, 
        RegionId, 
        SUM(PlayCount) PerRegionCount
    FROM TrackedData
    GROUP BY VideoId, RegionId
) t2
Run Code Online (Sandbox Code Playgroud)

此示例已简化但显示了问题。t1 查询有更详细的数据,我想在 t2 查询中重用它,因为在实际项目中很难在 t1 查询中获取数据(百万行、许多过滤器和分组等)。我想重用这个查询的第二个原因是查询长度。我不想重复有大约 60 行代码的稍微更改的查询。

mysql group-by subquery temp-tables common-table-expression

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

SQL按月分割

下午好,我看起来似乎是一个简单的问题,事实证明并非那么简单.我有2个约会.BeginPeriod(2010-06-10)和EndPeriod(2011-06-11).

如果这些日期可以分解为各自的月度分析,我希望看到什么.对于上面的例子,像

  • 2010/06/10 - 2010/06/30
  • 2010/07/01 - 2010/07/31
  • 2010/08/01 - 2010/08/31
  • ............
  • 2011/06/01 - 2011/06/10

我并不特别关注这种方法.CTE很好,但不是首选.正如他们所说,乞丐不能选择.

一切顺利,乔治

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

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

SQL - ";"附近的语法不正确

我有一个写递归SQL查询,返回一些int值.SQL查询如下所示:

;WITH GroupHIERARCHY(ID)  
    AS  (  SELECT ID   
    FROM tFirstTable te  
    WHERE te.LevelID <> 0   
    AND GroupID =-1
    UNION ALL  
    SELECT t.ElementID  
    FROM tFirstTable AS t, tSecondTable,GroupHIERARCHY  
    WHERE t.TypeID=tSecondTable.TypeID  
    AND GroupHIERARCHY.ID= t.GroupID)

    SELECT ID FROM GroupHIERARCHY
Run Code Online (Sandbox Code Playgroud)

这将返回一些整数值.(工作正常)我想要做的是我想写一个如下的查询:

Select * from tExampleTable 
WHERE FirstParameter IN (IntegerValuesHere) OR SecondParameter IN (IntegerValuesHere)
Run Code Online (Sandbox Code Playgroud)

其中,IntegerValuesHere是我从递归查询中获得的值.

查询现在看起来像:

Select * FROM tExampleTable 
    WHERE FirstParameter IN (
        ;WITH GroupHIERARCHY(ID)  
        AS  (  SELECT ID   
        FROM tFirstTable te  
        WHERE te.LevelID <> 0   
        AND GroupID =-1
        UNION ALL  
        SELECT t.ElementID …
Run Code Online (Sandbox Code Playgroud)

sql sql-server common-table-expression

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