我几乎在所有场景中都使用临时表,当人们向我提起 CTE 时,通常会发现 CTE 具有其用途。与其他方法相比,CTE 有何用途?至于可读性,CTE 现在是可维护代码的最佳实践吗?
我想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) 此查询不起作用:
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)
你能帮忙吗?
真实查询使用表格,但在示例中并不重要.
非常感谢
你知道用大量空行填充表格的任何有效方法吗?使用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).
我将不胜感激任何帮助.
这个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)
为什么?
是否可以将非选择查询(更新,插入,删除)嵌入到另一个查询中?
像(在选择内插入)
A single query:
select such,and,such from .... where .... insert into .... ;
Run Code Online (Sandbox Code Playgroud) 我收到这个错误:
查询错误:您的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) 所以我有类似的要求
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.你能帮我理解这段代码中的错误吗?
我想插入一个由此查询返回的结果:
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脚本,我需要以下映射:
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,但是我不知道如何或是否有可能使用通用表表达式来执行此操作。