标签: common-table-expression

在什么用例中您会使用 CTE 而不是临时表

我几乎在所有场景中都使用临时表,当人们向我提起 CTE 时,通常会发现 CTE 具有其用途。与其他方法相比,CTE 有何用途?至于可读性,CTE 现在是可维护代码的最佳实践吗?

sql sql-server common-table-expression

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

对按公共键分组的 n 行数据使用 string_agg()

我想string_agg(column_name,',')在 SQL 结果集中的列中使用一些 ID。我将按单个键进行分组,但也想确保每个分组集都会导致 n 行被输入到函数string_agg(column_name,',')

例子:

create table #temp (first_name varchar(20), data_id char(3))
insert into #temp (first_name, data_id) values('jeff', 'XX1')
insert into #temp (first_name, data_id) values('jeff', 'X23')
insert into #temp (first_name, data_id) values('jeff', 'X87')
insert into #temp (first_name, data_id) values('jeff', 'X09')
insert into #temp (first_name, data_id) values('jeff', 'X15')

insert into #temp (first_name, data_id) values('bob', 'X76')
insert into #temp (first_name, data_id) values('bob', 'X17')
insert into #temp (first_name, data_id) values('bob', 'X98')
insert into #temp (first_name, data_id) values('bob', …
Run Code Online (Sandbox Code Playgroud)

sql sql-server common-table-expression recursive-cte

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

UNION ALL之后的CTE

此查询不起作用:

WITH a AS 
(SELECT 1 AS c1)
SELECT
    *
FROM
    a 


UNION ALL

WITH b AS 
(SELECT 1 AS c1)
SELECT
    *
FROM
    b
Run Code Online (Sandbox Code Playgroud)

你能帮忙吗?

真实查询使用表格,但在示例中并不重要.

非常感谢

sql sql-server common-table-expression

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

用百万空行填充表的有效方法

你知道用大量空行填充表格的任何有效方法吗?使用WHILE子句插入它们 并不是很有效.用空行填充表肯定有更好的方法:

DECLARE @CNT int
SET @CNT = 1
WHILE @CNT < 3
BEGIN
INSERT INTO TAB VALUES( '1' )
SET @CNT = @CNT + 1
END
Run Code Online (Sandbox Code Playgroud)

我还想知道,如果可以在SELECT不使用任何现有表的情况下使用子句和CTE(公用表表达式)显示1 mil行(编号从1到1000000).

我将不胜感激任何帮助.

t-sql insert common-table-expression sql-server-2008

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

使用WITH语句时无法定义SQL变量

这个sql是有效的:

 WITH A AS
 (SELECT TOP 1000 * 
  FROM dbo.SomeTable)

 SELECT * FROM A
Run Code Online (Sandbox Code Playgroud)

虽然这个给出错误(关键字'DECLARE'附近的语法不正确):

WITH A AS
(SELECT TOP 1000 * 
 FROM dbo.SomeTable)

 DECLARE @dt DATETIME 

 SET @dt = GETDATE()
 SELECT * FROM A

 PRINT DATEDIFF(SS,GETDATE(),@dt)
Run Code Online (Sandbox Code Playgroud)

为什么?

sql sql-server common-table-expression sql-server-2008

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

SELECT类型查询是唯一可以嵌套的类型吗?

是否可以将非选择查询(更新,插入,删除)嵌入到另一个查询中?

像(在选择内插入)

A single query:

select such,and,such from .... where .... insert into .... ;
Run Code Online (Sandbox Code Playgroud)

mysql sql postgresql nested-queries common-table-expression

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

使用CTE的SQL错误

我收到这个错误:

查询错误:您的SQL语法中有错误; 检查与您的MariaDB服务器版本对应的手册,以便在'; WITH convs AS附近使用正确的语法(在第1行选择c.id,c.title,c.seen,c.id_receiver,c.id_send')

当我使用此查询时:

$query = ";WITH convs AS (
        select c.id, c.title, c.seen, c.id_receiver, c.id_sender
        from conversations c
        )
        select id, title, seen, id_receiver, id_sender
        from convs
        where id_receiver = '5'
        order by title desc limit 0,25";

$res = mysqli_query($connection ,$query);
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?非常感谢您的帮助.

PS:我最小化查询以使这个上下文变得简单,如果你帮我找到解决方案,我可能在完整查询中有另一个问题.所以我可以回复你的帮助.提前致谢.

编辑(整个查询)

$query = "WITH convs AS (
        select c.id, c.title, c.seen, c.id_receiver, c.id_sender,
        (select max(date) from messages where id_conversation = c.id and id_user <> '$iduser') as last_msg,
        (select top 1 id_user from messages …
Run Code Online (Sandbox Code Playgroud)

php mysql sql mysqli common-table-expression

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

语法错误:WITH在此位置无效输入

所以我有类似的要求

    WITH customers_in_usa AS (
        SELECT 
           customerName, state
        FROM
           customers
        WHERE
           country = 'USA'
    ) SELECT 
        customerName
    FROM
        customers_in_usa
    WHERE
        state = 'CA'
    ORDER BY customerName;
Run Code Online (Sandbox Code Playgroud)

但是在写入时我发现了一个错误:'WITH在此位置无效输入' error_picture.你能帮我理解这段代码中的错误吗?

mysql sql common-table-expression

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

无法从SQL Server中的WITH ROWS AS子句插入临时表

我想插入一个由此查询返回的结果:

WITH rows AS 
                (
                SELECT  *, ROW_NUMBER() OVER (ORDER BY [????]) AS rn
                FROM    [PROC_MN].[dbo].[TBL_FINISH_STATUS]
                 where   PO_NO='GV12762' and ???? BETWEEN '2018/03/16' AND '2018/03/18' AND [????]='Bonding'
                ) 
                SELECT  DATEDIFF(minute, mc.[????], mp.[????])
                FROM    rows mc
                JOIN    rows mp
                ON      mc.rn = mp.rn - 1 
Run Code Online (Sandbox Code Playgroud)

结果是:91

我使用此查询但不能,请帮忙!

IF OBJECT_ID('tempdb..#tempTest') IS NOT NULL     
    DROP TABLE #tempTest

        Insert into #tempTest
        WITH rows AS 
                (
                SELECT  *, ROW_NUMBER() OVER (ORDER BY [????]) AS rn
                FROM    [PROC_MN].[dbo].[TBL_FINISH_STATUS]
                 where   PO_NO='GV12762' and ???? BETWEEN '2018/03/16' AND '2018/03/18' AND …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server common-table-expression

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

通过CTE使用INSERT

对于稍微复杂的SQL脚本,我需要以下映射:

WITH days_mapping AS (SELECT 1 AS day
UNION ALL
SELECT 2 AS day
UNION ALL
...
SELECT 31 AS day)
Run Code Online (Sandbox Code Playgroud)

有什么方法可以创建相同的映射,但是无需手动为该映射中的每个数字/天手动编写SELECT和UNION ALL?我当时想在WHILE循环中执行INSERT而不是SELECT,但是我不知道如何或是否有可能使用通用表表达式来执行此操作。

sql sql-server common-table-expression

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