标签: common-table-expression

我可以在TSQL中使用WITH两次来过滤像我的例子那样的结果集吗?

我需要做这样的事情,但SQL Server 2008不喜欢它.我的查询实际上比这更复杂,我意识到这不是完成我正在做的事情的最好方法,但我的重点是WITH语句的功能而不是select和where语句.

WITH stuff1 AS(从名为startdate> 0的员工中选择名称,startdate,id)

WITH stuff2 AS(从stuff1中选择名称,startdate,id)

select*from stuff2,其中id> 10

sql sql-server common-table-expression

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

使用带有CTE的光标

我需要一个光标用于下面的查询,所以我可以循环来获取/更新/插入一些其他数据.有人可以帮我这个吗?

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)

sql sql-server common-table-expression

14
推荐指数
2
解决办法
3万
查看次数

用于更新冲突的INSERT SELECT的语义没有返回

我们的生产系统遇到了一个非常奇怪的问题.不幸的是,尽管付出了很多努力,但我还是无法在本地重现这个问题,因此我无法提供最小,完整和可验证的示例.此外,由于这是生产代码,我不得不在以下示例中更改表的名称.不过,我相信我会提出所有相关事实.

我们有四个表bucket_holder,bucket,itembucket_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 postgresql concurrency common-table-expression

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

奇怪的性能问题:内联用户定义函数中的公用表表达式

对于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

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

是否可以仅在另一列也相同时使用ROW_NUMBER()OVER/PARTITION BY?

我正在使用此代码:(来自这个问题:如何获取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

13
推荐指数
2
解决办法
7万
查看次数

树结构和递归

使用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)

sql postgresql tree recursive-query common-table-expression

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

在PostgreSQL中组合两个SELECT查询

我想结合两个选择查询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)

sql postgresql union common-table-expression

13
推荐指数
1
解决办法
2万
查看次数

在BigQuery中使用

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)

sql common-table-expression google-bigquery

13
推荐指数
2
解决办法
2万
查看次数

PostgreSQL是否共享CTE的排序?

在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 postgresql common-table-expression

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

SQL Server:如何将CTE递归限制为只是递归添加的行?

更简单的例子

让我们尝试一个更简单的例子,这样人们可以围绕这些概念,并有一个实际的例子,你可以复制并粘贴到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-server common-table-expression

12
推荐指数
1
解决办法
2万
查看次数