标签: common-table-expression

你如何在MySQL中使用"WITH"子句?

我正在将我的所有SQL Server查询转换为MySQL,并且我的查询WITH都失败了.这是一个例子:

WITH t1 AS
(
     SELECT article.*, userinfo.*, category.*
     FROM question
     INNER JOIN userinfo ON userinfo.user_userid = article.article_ownerid
     INNER JOIN category ON article.article_categoryid = category.catid
     WHERE article.article_isdeleted = 0
)
SELECT t1.*
FROM t1
ORDER BY t1.article_date DESC
LIMIT 1, 3
Run Code Online (Sandbox Code Playgroud)

mysql common-table-expression with-clause subquery-factoring mysql-8.0

100
推荐指数
5
解决办法
19万
查看次数

如何在单个SELECT语句中使用多个公用表表达式?

我正在简化复杂的select语句,所以我想我会使用常用的表表达式.

声明一个cte工作正常.

WITH cte1 AS (
    SELECT * from cdr.Location
    )

select * from cte1 
Run Code Online (Sandbox Code Playgroud)

是否可以在同一个SELECT中声明和使用多个cte?

即这个sql给出了一个错误

WITH cte1 as (
    SELECT * from cdr.Location
)

WITH cte2 as (
    SELECT * from cdr.Location
)

select * from cte1    
union     
select * from cte2
Run Code Online (Sandbox Code Playgroud)

错误是

Msg 156, Level 15, State 1, Line 7
Incorrect syntax near the keyword 'WITH'.
Msg 319, Level 15, State 1, Line 7
Incorrect syntax near the keyword 'with'. If this statement is a common table …
Run Code Online (Sandbox Code Playgroud)

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

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

MySQL"WITH"子句

我正在尝试使用MySQL创建一个带有"WITH"子句的视图

WITH authorRating(aname, rating) AS
   SELECT aname, AVG(quantity)
   FROM book
   GROUP BY aname
Run Code Online (Sandbox Code Playgroud)

但似乎MySQL并不支持这一点.

我认为这是非常标准的,我确信Oracle支持这一点.反正强制MySQL使用"WITH"子句吗?我用MyISAM和innoDB引擎试过了.这两个都不起作用.

mysql sql common-table-expression

89
推荐指数
5
解决办法
18万
查看次数

使用Postgres一次在3个表中插入数据

我想通过一个查询将数据插入到3个表中.
我的表如下所示:

CREATE TABLE sample (
   id        bigserial PRIMARY KEY,
   lastname  varchar(20),
   firstname varchar(20)
);

CREATE TABLE sample1(
   user_id    bigserial PRIMARY KEY,
   sample_id  bigint REFERENCES sample,
   adddetails varchar(20)
);

CREATE TABLE sample2(
   id      bigserial PRIMARY KEY,
   user_id bigint REFERENCES sample1,
   value   varchar(10)
);
Run Code Online (Sandbox Code Playgroud)

我将获得一个密钥以换取每次插入,我需要在下一个表中插入该密钥.
我的查询是:

insert into sample(firstname,lastname) values('fai55','shaggk') RETURNING id;
insert into sample1(sample_id, adddetails) values($id,'ss') RETURNING user_id;
insert into sample2(user_id, value) values($id,'ss') RETURNING id;
Run Code Online (Sandbox Code Playgroud)

但是,如果我运行单个查询,他们只是向我返回值,我不能立即在下一个查询中重用它们.

怎么做到这一点?

sql postgresql common-table-expression sql-insert sql-returning

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

从CTE更新表中的记录

我有以下CTE,它将为我提供整个发票的DocTotal.

 ;WITH CTE_DocTotal
 AS
 (
   SELECT SUM(Sale + VAT) AS DocTotal
   FROM PEDI_InvoiceDetail
   GROUP BY InvoiceNumber
 )

UPDATE PEDI_InvoiceDetail
SET DocTotal = CTE_DocTotal.DocTotal
Run Code Online (Sandbox Code Playgroud)

现在有了这个结果,我想在PEDI_InvoiceDetail中输入DocTotal值列.

我知道不会工作,我知道我错过了什么,它是什么?

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

58
推荐指数
3
解决办法
11万
查看次数

如何在一个PostgreSQL查询中使用多个WITH语句?

我想使用WITH语句"声明"什么是有效的多个TEMP表.我试图执行的查询是这样的:

WITH table_1 AS (
SELECT GENERATE_SERIES('2012-06-29', '2012-07-03', '1 day'::INTERVAL) AS date
)

WITH table_2 AS (
SELECT GENERATE_SERIES('2012-06-30', '2012-07-13', '1 day'::INTERVAL) AS date
)

SELECT * FROM table_1
WHERE date IN table_2
Run Code Online (Sandbox Code Playgroud)

我已阅读PostgreSQL文档,并研究使用多个WITH语句,但无法找到答案.

sql postgresql common-table-expression

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

CTE错误:"锚点和递归部分之间的类型不匹配"

我正在执行以下声明:

;WITH cte AS (
  SELECT 
    1 as rn, 
    'name1' as nm
  UNION ALL
  SELECT 
    rn + 1,
    nm = 'name' + CAST((rn + 1) as varchar(255))
  FROM cte a WHERE rn < 10)
SELECT * 
FROM cte
Run Code Online (Sandbox Code Playgroud)

...完成错误...

Msg 240, Level 16, State 1, Line 2
Types don't match between the anchor and the recursive part in column "nm" of recursive query "cte".
Run Code Online (Sandbox Code Playgroud)

我在哪里弄错了?

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

56
推荐指数
3
解决办法
6万
查看次数

常用表表达式,为什么用分号?

通常在SQL ServerCommon Table Expression子句中,语句前面有分号,如下所示:

;WITH OrderedOrders AS --semicolon here
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 50 AND 60
Run Code Online (Sandbox Code Playgroud)

为什么?

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

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

多次使用一个CTE

我有这个,我在设定总数时得到一个错误.为什么我不能多次访问cte?

ALTER PROCEDURE [dbo].[GetLeaguePlayers]
(
    @idleague int,
    @pageNumber int,
    @pageSize int,
    @total int OUTPUT
)
AS
WITH CTEPlayers AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY p.Name) AS RowNumber, p.Id, p.Name, t.Name AS Team
    FROM Players p INNER JOIN Teams t ON p.IdTeam=t.Id INNER JOIN Leagues l ON l.Id=t.IdLeague
    WHERE l.Id=@idleague
)
SELECT Id, Name
FROM CTEPlayers c
WHERE RowNumber>@pageSize*(@pageNumber-1) AND RowNumber<@pageSize*@pageNumber;
SET @total = ( SELECT COUNT(*) FROM CTEPlayers )
Run Code Online (Sandbox Code Playgroud)

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

51
推荐指数
4
解决办法
6万
查看次数

你如何联合多个CTE?

你如何使用UNION多个Common Table Expressions

我正在尝试汇总一些摘要数字,但无论我把它放在哪里;,我总是会收到错误

SELECT  COUNT(*)
FROM    dbo.Decision_Data
UNION
SELECT  COUNT(DISTINCT Client_No)
FROM    dbo.Decision_Data
UNION
WITH    [Clients]
          AS ( SELECT   Client_No
               FROM     dbo.Decision_Data
               GROUP BY Client_No
               HAVING   COUNT(*) = 1
             )
    SELECT  COUNT(*) AS [Clients Single Record CTE]
    FROM    Clients;
Run Code Online (Sandbox Code Playgroud)

更新:我很欣赏上面的例子我可以将单个 CTE移到开头,但我有一些我想要的CTEUNION

sql-server union common-table-expression

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