之前从未使用过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等的命令来显示它们/它们?因为如果它们被保存在那里可能已经存在执行此操作的查询.
我正在使用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) 我有一个基于一些在线示例编写的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 的值,但由于某些原因它似乎不在范围内?
我不能使用公用表表达式:
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
使用 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
我有以下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
这只是一个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只有一个值,而不是一个行集,但我怎么弄,每当它们被用来在我经历复杂的查询,而不必重复子查询获得我的查询值仅一次定义?
我有非常大的查询,它从许多表中获取数据并按所有非计算列对它们进行分组。我需要多次重用这个查询,但需要进行其他分组和过滤。在 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 行代码的稍微更改的查询。
下午好,我看起来似乎是一个简单的问题,事实证明并非那么简单.我有2个约会.BeginPeriod(2010-06-10)和EndPeriod(2011-06-11).
如果这些日期可以分解为各自的月度分析,我希望看到什么.对于上面的例子,像
我并不特别关注这种方法.CTE很好,但不是首选.正如他们所说,乞丐不能选择.
一切顺利,乔治
我有一个写递归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 ×7
sql-server ×5
t-sql ×3
postgresql ×2
adodb ×1
group-by ×1
mysql ×1
oledb ×1
sql-order-by ×1
subquery ×1
temp-tables ×1