我有以下问题:我有一个用于维护分层数据的表.我想在SQL 2005中使用CTE.
WITH tree (id, parentid, code, name) AS
(
SELECT id, ofs.ParentID, ofs.code, ofs.name
FROM OrganizationFeatures ofs
WHERE ofs.ParentID IS NULL
UNION ALL
SELECT ofs.id, ofs.ParentID, ofs.code, ofs.name
FROM OrganizationFeatures ofs
JOIN tree ON tree.ID = ofs.ParentID
)
select * from tree
Run Code Online (Sandbox Code Playgroud)
但我想按代码排序,结果如下:
1
1/1
1/1/1
1/1/2
1/2/1
1/2/2
2
4/1
Run Code Online (Sandbox Code Playgroud)
等任何想法?
sql-server sql-server-2005 hierarchical common-table-expression
我在下面粘贴了一个非常简化的SQL查询版本.我遇到的问题是该ORDER BY语句影响了我的CTE的选择结果.我无法理解为什么会这样,我最初的想法是在CTE中,我执行一些SELECT声明,然后ORDER BY应该对THOSE结果起作用.
不幸的是,我看到的行为是我的内心SELECT陈述受到了订单的影响,给了我不属于TOP 10.
以下是数据示例:(按ID以相反顺序索引)
ID, Date
9600 2010-10-12
9599 2010-09-08
9598 2010-08-31
9597 2010-08-31
9596 2010-08-30
9595 2010-08-11
9594 2010-08-06
9593 2010-08-05
9592 2010-08-02
....
9573 2010-08-10
....
8174 2010-08-05
....
38 2029-12-20
Run Code Online (Sandbox Code Playgroud)
我的基本查询:
;with results as(
select TOP 10 ID, Date
from dbo.items
)
SELECT ID
FROM results
Run Code Online (Sandbox Code Playgroud)
查询返回:
ID, Date
9600 2010-10-12
9599 2010-09-08
9598 2010-08-31
9597 2010-08-31
9596 2010-08-30
9595 2010-08-11
9594 2010-08-06
9593 2010-08-05 …Run Code Online (Sandbox Code Playgroud) 我有一个像这样结构的树:
__2__3__4
/ \__5__6
0__1___7/__8__9
\\
\\__10__11__12
\__ __ __
13 14 15
Run Code Online (Sandbox Code Playgroud)
节点1有四个子节点(2,7,10,13),节点2和节点7各有两个子节点(作为子节点共享节点5).我要做的是创建一个CTE,它提供包含父节点,节点,远离根的距离以及包含在其中的分支(或分支)的记录.
IF (OBJECT_ID('tempdb..#Discovered') IS NOT NULL)
BEGIN
DROP TABLE #Discovered
END
CREATE TABLE #Discovered
(
ID int PRIMARY KEY NOT NULL,
Predecessor int NULL,
OrderDiscovered int
);
INSERT INTO #Discovered (ID, Predecessor, OrderDiscovered)
VALUES (@nodeId, NULL, 0);
--loop through node connections table in a breadth first manner
WHILE @@ROWCOUNT > 0
BEGIN
INSERT INTO #Discovered (ID, Predecessor, OrderDiscovered)
SELECT c.node2_id
,MIN(c.node1_id)
,MIN(d.OrderDiscovered) + 1
FROM #Discovered d …Run Code Online (Sandbox Code Playgroud) t-sql common-table-expression sql-server-2008 depth-first-search
假设我有这个表:
select * from window_test;
k | v
---+---
a | 1
a | 2
b | 3
a | 4
Run Code Online (Sandbox Code Playgroud)
最终我想得到:
k | min_v | max_v
---+-------+-------
a | 1 | 2
b | 3 | 3
a | 4 | 4
Run Code Online (Sandbox Code Playgroud)
但我会很高兴得到这个(因为我可以很容易地过滤它distinct):
k | min_v | max_v
---+-------+-------
a | 1 | 2
a | 1 | 2
b | 3 | 3
a | 4 | 4
Run Code Online (Sandbox Code Playgroud)
使用PostgreSQL 9.1+窗口函数可以实现这一点吗?我试图了解我是否可以使用单独的分区来处理k=a此示例中的第一次和最后一次(按顺序排列v).
我正在为当前雇主编写许多报告查询,利用Oracle的WITH子句允许自己创建简单的步骤,每个步骤都是一个面向数据的转换,它们相互构建以执行复杂的任务.
今天我注意到,过度使用该WITH条款可能会对Oracle服务器的资源产生负面影响.
任何人都可以解释为什么过度使用Oracle WITH子句可能导致服务器崩溃?或者指出一些我可以研究适当用例的文章?我开始WITH大量使用该子句来为我的代码添加结构并使其更容易理解.我希望在这里提供一些信息性的回复,我可以继续有效地使用它.
如果示例查询有用,我会尝试今天稍后发布.
谢谢!
我有以下分层树表
GO
DROP TABLE #tbl
GO
CREATE TABLE #tbl (Id int , ParentId int)
INSERT INTO #tbl (Id, ParentId) VALUES (0, NULL)
INSERT INTO #tbl (Id, ParentId) VALUES (1, 0)
INSERT INTO #tbl (Id, ParentId) VALUES (2, 1)
INSERT INTO #tbl (Id, ParentId) VALUES (3, 1)
INSERT INTO #tbl (Id, ParentId) VALUES (4, 2)
INSERT INTO #tbl (Id, ParentId) VALUES (5, 2)
INSERT INTO #tbl (Id, ParentId) VALUES (6, 3)
INSERT INTO #tbl (Id, ParentId) VALUES (7, 3)
GO
Run Code Online (Sandbox Code Playgroud)
哪个映射到后面的树 …
SQLite现在有CTE,文档说你可以使用它来插入,更新和删除查询 - 但只提供了select语句的例子.
我可以通过insert-select弄清楚CTE如何应用于插入; 但是如果没有from-clause,我们如何在更新或删除中使用它们呢?
我有一个在SQL Server 2014表中呈现的二叉树:
UserID ParentUserID Position
----------------------------
1 Null Null <-- ROOT
2 1 Left
3 1 Right <-- Last Right for ID=1 (CTE query return 3)
4 2 Left
5 4 Left
6 5 Left
7 6 Left <-- Last Left for ID=1 (CTE query return 6)
Run Code Online (Sandbox Code Playgroud)
要获得最后一个id和最后一个id我正在使用CTE查询:
; with left_hand_recurse as
(
select UserID
, ParentUserID
, 1 as depth
from Table1 where ParentUserID is null
union all
select child.UserID
, child.ParentUserID
, parent.depth + 1
from left_hand_recurse …Run Code Online (Sandbox Code Playgroud) 我需要将两个父>子表集中的数据合并/合并到第三个父>子表中.
表格如下所示:

这三组表的唯一区别是TableC有一TableType列可以帮助识别TableA记录和TableB记录之间的差异.
我的第一个想法是使用游标..这是创建表结构,插入一些记录,然后将数据合并在一起的代码.它工作得非常好,sooooo ....
--Create the tables
CREATE TABLE TableA
(
ID int not null identity primary key,
Name VARCHAR(30)
);
CREATE TABLE TableAChild
(
ID int not null identity primary key,
Parent int not null,
Name VARCHAR(30),
CONSTRAINT FK_A FOREIGN KEY (Parent) REFERENCES TableA(ID)
);
CREATE TABLE TableB
(
ID int not null identity primary key,
Name VARCHAR(30)
);
CREATE TABLE TableBChild
(
ID int not null identity primary key,
Parent int not null,
Name VARCHAR(30), …Run Code Online (Sandbox Code Playgroud) 所有都用于临时存储数据.
这3种临时表是否存在性能差异(时间复杂度和空间复杂度)?
性能问题应取决于结果是保存在磁盘还是内存中.
我搜索了很多,但没有得到满意的答案.
sql sql-server performance temp-tables common-table-expression
sql ×7
sql-server ×6
t-sql ×2
cursor ×1
database ×1
hierarchical ×1
oracle ×1
oracle11g ×1
performance ×1
postgresql ×1
sql-update ×1
sqlite ×1
temp-tables ×1