我需要以特定的方式获得树的有序层次结构.有问题的表看起来有点像这样(所有ID字段都是uniqueidentifiers,为了示例,我简化了数据):
EstimateItemID EstimateID ParentEstimateItemID ItemType
-------------- ---------- -------------------- --------
1 A NULL product
2 A 1 product
3 A 2 service
4 A NULL product
5 A 4 product
6 A 5 service
7 A 1 service
8 A 4 product
树形结构的图形视图(*表示"服务"):
A
___/ \___
/ \
1 4
/ \ / \
2 7* 5 8
/ /
3* 6*
使用此查询,我可以获得层次结构(只是假装'A'是一个唯一标识符,我知道它不在现实生活中):
DECLARE @EstimateID uniqueidentifier
SELECT @EstimateID = 'A'
;WITH temp as(
SELECT * FROM EstimateItem
WHERE EstimateID = @EstimateID …Run Code Online (Sandbox Code Playgroud) 是否可以在单个查询中组合多个CTE arel?我正在寻找获得这样结果的方法:
WITH 'cte1' AS (
...
),
WITH RECURSIVE 'cte2' AS (
...
),
WITH 'cte3' AS (
...
)
SELECT ... FROM 'cte3' WHERE ...
Run Code Online (Sandbox Code Playgroud)
如你所见,我有一个递归CTE和两个非递归.
我面临一个问题,即在TVF内声明CTE的maxrecursion选项
这是CTE(一个简单的日历):
DECLARE @DEBUT DATE = '1/1/11', @FIN DATE = '1/10/11';
WITH CTE as(
SELECT @debut as jour
UNION ALL
SELECT DATEADD(day, 1, jour)
FROM CTE
WHERE DATEADD(day, 1, jour) <= @fin)
SELECT jour FROM CTE option (maxrecursion 365)
Run Code Online (Sandbox Code Playgroud)
和TVF:
CREATE FUNCTION [liste_jour]
(@debut date,@fin date)
RETURNS TABLE
AS
RETURN
(
WITH CTE as(
SELECT @debut as jour
UNION ALL
SELECT DATEADD(day, 1, jour)
FROM CTE
WHERE DATEADD(day, 1, jour) <= @fin)
SELECT jour FROM CTE
--option (maxrecursion 365)
) …Run Code Online (Sandbox Code Playgroud) 应该是一个非常直截了当的问题.我可以将INDEX添加到公用表表达式(CTE)吗?
我使用的是SQL Server 2005.我的存储过程中有2个WITH子句
WITH SomeClause1 AS
(
SELECT ....
)
WITH SomeClause2 AS
(
SELECT ....
)
Run Code Online (Sandbox Code Playgroud)
但是错误发生了
关键字'with'附近的语法不正确.如果此语句是公用表表达式或xmlnamespaces子句,则必须以分号结束前一个语句.
我有什么选择?有什么分配器我不知道吗?
sql t-sql sql-server sql-server-2005 common-table-expression
我已经了解到某些版本的Microsoft OLE DB Provider for SQL Server(主要在Windows XP上)不支持WITH语句.所以,我决定将我的SQL语句移动到表值函数中,并从我的应用程序中调用它.现在,我被困住了.我应该如何使用该INSERT INTO声明WITH?这是我到目前为止的代码,但SQL Server不喜欢它... :-(
CREATE FUNCTION GetDistributionTable
(
@IntID int,
@TestID int,
@DateFrom datetime,
@DateTo datetime
)
RETURNS
@Table_Var TABLE
(
[Count] int,
Result float
)
AS
BEGIN
INSERT INTO @Table_Var ([Count], Result) WITH T(Result)
AS (SELECT ROUND(Result - AVG(Result) OVER(), 1)
FROM RawResults WHERE IntID = @IntID AND DBTestID = @TestID AND Time >= @DateFrom AND Time <= @DateTo)
SELECT COUNT(*) AS [Count],
Result
FROM T …Run Code Online (Sandbox Code Playgroud) 我们如何在sql server中的子查询中使用CTE?
喜欢 ..
选择id(我想在这里使用CTE),来自table_name的名称
sql t-sql sql-server sql-server-2005 common-table-expression
是否可以在Linq to SQL中执行公用表表达式(CTE)(如下所示).我对CTE和Linq to SQL都很陌生.
我目前正在免费存储过程(但不能以任何方式对付它们)所以我不想仅仅针对一个查询进行存储过程的跳跃,除非它是完全必要的.
这是我在SQL中做的一个例子,我想知道我是否可以在Linq to SQL中做:
WITH TaskHierarchy (TaskID, [Subject], ParentID, HierarchyLevel, HierarchyPath) AS
(
-- Base case
SELECT
TaskID,
[Subject],
ParentID,
1 as HierarchyLevel,
CONVERT(VARCHAR(MAX),'/') AS HierarchyPath
FROM Task
WHERE TaskID = 2
UNION ALL
-- Recursive step
SELECT
t.TaskID,
t.Subject,
t.ParentID,
th.HierarchyLevel + 1 AS HierarchyLevel,
CONVERT(varchar(MAX),th.HierarchyPath + CONVERT(VARCHAR(32),t.ParentID) + '/') AS HierarchyPath
FROM Task t
INNER JOIN TaskHierarchy th ON
t.ParentID = th.TaskID
)
SELECT *
FROM TaskHierarchy
ORDER BY HierarchyLevel, [Subject]
Run Code Online (Sandbox Code Playgroud) 有没有人设法在SQL Server的T-SQL中创建一个CTE,其中还包含一个WITH XMLNAMESPACES声明?
似乎两个WITH关键词都坚持成为"T-SQL批处理中的第一个",而这并不能真正起作用....
我试过了:
WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
WITH CTEQuery AS
(
SELECT (list of fields)
FROM dbo.MyTable
WHERE (conditions)
)
SELECT * FROM CTEQuery
Run Code Online (Sandbox Code Playgroud)
没用了:-((语法错误)
消息156,级别15,状态1,行2
关键字'WITH'附近的语法不正确.
消息319,级别15,状态1,行2
关键字'with'附近的语法不正确.如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号终止先前的语句.
所以我尝试WITH用分号前面加第二个:
WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
;WITH CTEQuery AS
(
SELECT (list of fields)
FROM dbo.MyTable
WHERE (conditions)
)
SELECT * FROM CTEQuery
Run Code Online (Sandbox Code Playgroud)
得到了这个:
消息102,级别15,状态1,行2
'''附近的语法不正确.
然后我尝试将其WITH XMLNAMESPACES放入CTE:
WITH CTEQuery AS
(
WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
SELECT (list of fields)
FROM dbo.MyTable …Run Code Online (Sandbox Code Playgroud) 我正在使用公用表表达式进行分页:
with query as (
Select Row_Number() over (Order By OrderNum ASC) as TableRowNum,
FirstName,
LastName
From Users
)
Select * from query where TableRowNum between 1 and 25 Order By TableRowNum ASC
Run Code Online (Sandbox Code Playgroud)
在进行此查询后,我立即进行几乎相同的查询以检索项目总数:
with query as (
Select Row_Number() over (Order By OrderNum ASC) as TableRowNum,
FirstName,
LastName
From Users
)
Select Count(*) from query
Run Code Online (Sandbox Code Playgroud)
我尝试将这些组合在一起(即:定义CTE,查询数据然后查询Count,但是当我这样做时,我收到错误消息"无效对象名称'查询'"以响应第二个查询(计数).
有没有办法将这两个查询合并为一个,以保存到DB的往返?