我需要做这样的事情,但SQL Server 2008不喜欢它.我的查询实际上比这更复杂,我意识到这不是完成我正在做的事情的最好方法,但我的重点是WITH语句的功能而不是select和where语句.
WITH stuff1 AS(从名为startdate> 0的员工中选择名称,startdate,id)
WITH stuff2 AS(从stuff1中选择名称,startdate,id)
select*from stuff2,其中id> 10
我需要一个光标用于下面的查询,所以我可以循环来获取/更新/插入一些其他数据.有人可以帮我这个吗?
DECLARE @FROMDATE DATETIME
DECLARE @TODATE DATETIME
SELECT @FROMDATE = Getdate()
SELECT @TODATE = Getdate() + 7
;WITH DATEINFO(DATES)
AS (SELECT @FROMDATE
UNION ALL
SELECT DATES + 1
FROM DATEINFO
WHERE DATES < @TODATE)
SELECT *
FROM DATEINFO
OPTION (MAXRECURSION 0)
Run Code Online (Sandbox Code Playgroud)
我尝试了很多方法,但没有发现任何有用的方法.
我正在使用
declare @adate datetime
DECLARE @FROMDATE DATETIME
DECLARE @TODATE DATETIME
select @FROMDATE=getdate()
select @TODATE =getdate()+7
declare @weekdates cursor for
WITH DATEINFO(DATES) AS (SELECT @FROMDATE UNION ALL SELECT DATES + 1 FROM DATEINFO WHERE DATES < @TODATE)
SELECT * …Run Code Online (Sandbox Code Playgroud) 我们的生产系统遇到了一个非常奇怪的问题.不幸的是,尽管付出了很多努力,但我还是无法在本地重现这个问题,因此我无法提供最小,完整和可验证的示例.此外,由于这是生产代码,我不得不在以下示例中更改表的名称.不过,我相信我会提出所有相关事实.
我们有四个表bucket_holder,bucket,item并bucket_total创建如下:
CREATE TABLE bucket_holder (
id SERIAL PRIMARY KEY,
bucket_holder_uid UUID NOT NULL
);
CREATE TABLE bucket (
id SERIAL PRIMARY KEY,
bucket_uid UUID NOT NULL,
bucket_holder_id INTEGER NOT NULL REFERENCES bucket_holder (id),
default_bucket BOOLEAN NOT NULL
);
CREATE TABLE item (
id SERIAL PRIMARY KEY,
item_uid UUID NOT NULL,
bucket_id INTEGER NOT NULL REFERENCES bucket (id),
amount NUMERIC NOT NULL
);
CREATE TABLE bucket_total (
bucket_id INTEGER NOT NULL REFERENCES …Run Code Online (Sandbox Code Playgroud) 对于SQL人员来说,这是一个大脑扭转者 - 任何人都可以想到这些功能中的第一个表现良好的原因,第二个运行速度慢吗?
功能A - 通常在~5 ms内完成
CREATE FUNCTION dbo.GoodFunction
(
@IDs UniqueIntTable READONLY
)
RETURNS TABLE
AS RETURN
SELECT p.ID, p.Node, p.Name, p.Level
FROM
(
SELECT DISTINCT a.Ancestor AS Node
FROM Hierarchy h
CROSS APPLY dbo.GetAncestors(h.Node.GetAncestor(1)) a
WHERE h.ID IN (SELECT Value FROM @IDs)
) np
INNER JOIN Hierarchy p
ON p.Node = np.Node
Run Code Online (Sandbox Code Playgroud)
功能B - 运行速度极慢 - 我在5分钟后放弃了
CREATE FUNCTION dbo.BadFunction
(
@IDs UniqueIntTable READONLY
)
RETURNS TABLE
AS RETURN
WITH Ancestors_CTE AS
(
SELECT DISTINCT a.Ancestor AS …Run Code Online (Sandbox Code Playgroud) sql-server performance user-defined-functions common-table-expression sql-server-2008
我正在使用此代码:(来自这个问题:如何获取SQL中每个组的最后一条记录替换我自己的列)
WITH e AS
(
SELECT *,
ROW_NUMBER() OVER
(
PARTITION BY ApplicationId
ORDER BY theDate DESC
) AS Recency
FROM [Event]
)
SELECT *
FROM e
WHERE Recency = 1
Run Code Online (Sandbox Code Playgroud)
只有当两个字段相同时才可以"分区"吗?例如,我有这样的数据:
ID Name theDate
123 John 01/01/2012
123 John 01/02/2012
123 Doe 01/01/2012
456 Smith 02/04/2012
789 Smith 02/01/2012
789 Smith 02/09/2012
789 Roger 02/08/2012
Run Code Online (Sandbox Code Playgroud)
从那些我想要返回的数据:
ID Name theDate
123 John 01/02/2012
123 Doe 01/01/2012
456 Smith 02/04/2012
789 Smith 02/09/2012
789 Roger 02/08/2012
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
托马斯
sql-server sql-server-2005 row-number common-table-expression
使用PostgreSQL 8.4.14数据库,我有一个表格树结构的表,如下例所示:
CREATE TABLE unit (
id bigint NOT NULL PRIMARY KEY,
name varchar(64) NOT NULL,
parent_id bigint,
FOREIGN KEY (parent_id) REFERENCES unit (id)
);
INSERT INTO unit VALUES (1, 'parent', NULL), (2, 'child', 1)
, (3, 'grandchild A', 2), (4, 'grandchild B', 2);
Run Code Online (Sandbox Code Playgroud)
id | name | parent_id
----+--------------+-----------
1 | parent |
2 | child | 1
3 | grandchild A | 2
4 | grandchild B | 2
Run Code Online (Sandbox Code Playgroud)
我想为这些单元创建一个访问控制列表,其中每个单元可能拥有自己的ACL,或者从具有自己的ACL的最近的祖先继承它.
CREATE TABLE acl (
unit_id bigint NOT NULL …Run Code Online (Sandbox Code Playgroud) 我想结合两个选择查询UNION.
如何使用SELECT第二个中的第一个结果SELECT?
(SELECT carto_id_key FROM table1
WHERE tag_id = 16)
UNION
(SELECT * FROM table2
WHERE carto_id_key = <the carto_id result from above> )
Run Code Online (Sandbox Code Playgroud) BigQuery是否支持该WITH条款?我不喜欢格式化太多的子查询.
例如:
WITH alias_1 AS (SELECT foo1 c FROM bar)
, alias_2 AS (SELECT foo2 c FROM bar a, alias_1 b WHERE b.c = a.c)
SELECT * FROM alias_2 a;
Run Code Online (Sandbox Code Playgroud) 在PostgreSQL中,公用表表达式(CTE)是优化范围.这意味着CTE已实现为内存,并且来自另一个查询的谓词永远不会被推入CTE.
现在我想知道关于CTE的其他元数据(例如排序)是否与其他查询共享.我们来看看以下问题:
WITH ordered_objects AS
(
SELECT * FROM object ORDER BY type ASC LIMIT 10
)
SELECT MIN(type) FROM ordered_objects
Run Code Online (Sandbox Code Playgroud)
在这里,MIN(type)显然总是第一行ordered_objects(或者NULL如果ordered_objects是空的),因为ordered_objects已经被排序了type.这些知识ordered_objects在评估时是否可用SELECT MIN(type) FROM ordered_objects?
让我们尝试一个更简单的例子,这样人们可以围绕这些概念,并有一个实际的例子,你可以复制并粘贴到SQL Query Analizer:
想象一个具有层次结构的节点表:
A
- B
- C
Run Code Online (Sandbox Code Playgroud)
我们可以在Query Analizer中开始测试:
CREATE TABLE ##Nodes
(
NodeID varchar(50) PRIMARY KEY NOT NULL,
ParentNodeID varchar(50) NULL
)
INSERT INTO ##Nodes (NodeID, ParentNodeID) VALUES ('A', null)
INSERT INTO ##Nodes (NodeID, ParentNodeID) VALUES ('B', 'A')
INSERT INTO ##Nodes (NodeID, ParentNodeID) VALUES ('C', 'B')
Run Code Online (Sandbox Code Playgroud)
期望的输出:
ParentNodeID NodeID GenerationsRemoved
============ ====== ==================
NULL A 1
NULL B 2
NULL C 3
A B 1
A C 2
B C 1
Run Code Online (Sandbox Code Playgroud)
现在建议的CTE表达式,输出不正确:
WITH NodeChildren …Run Code Online (Sandbox Code Playgroud) sql ×7
sql-server ×5
postgresql ×4
concurrency ×1
performance ×1
row-number ×1
tree ×1
union ×1