标签: common-table-expression

如何将 CTE 与 FOR XML 子句结合起来?

我正在尝试生成一些具有不同嵌套级别的 XML,并且冒着过度简化的风险,输出 XML 将采用松散的格式:

<invoice number="1">
 <charge code="foo" rate="123.00">
  <surcharge amount="10%" />
 </charge>
 <charge code="bar" />
</invoice>
Run Code Online (Sandbox Code Playgroud)

我为此继承的数据库模式恰好将费用存储在不同的表中,这意味着附加费根据费用来源的表以不同的方式存储。

鉴于您不能将s 与 一起使用UNIONFOR XML,我UNION在 CTE 中做了一些 ing,因此大致如下:

WITH Charges ( [@code], [@rate], surcharge, InvoiceId ) AS (
    SELECT code AS [@Code], amount AS [@rate], NULL as surcharge, InvoiceId
    FROM item.charges
UNION ALL
    SELECT 
        code AS [@Code], 
        amount AS [@rate],
        (
             SELECT amount AS [@amount]
             FROM order.surcharges os
             WHERE oc.ChargeId = os.ChargeId
             FOR XML PATH('surcharge'), TYPE …
Run Code Online (Sandbox Code Playgroud)

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

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

Oracle SQL WITH 子句的正确用例和性能

我必须执行涉及多个深度连接和复杂谓词的相对复杂的查询,其中结果(和条件)取决于满足条件的合适条目。涉及主要和次要标准,始终应用主要标准,如​​果结果不令人满意,则进行次要打击。简而言之

  • 返回 N(伪)随机不同客户及其最新文档
  • 结果应包含等量的两种不同类型的文档

但如果没有足够的不同文档类型或不同客户的文档,请尝试仍然满足 N 个文档的数量

  • 通过选择更多其他文档类型来弥补其他文档类型的不足
  • 必要时使用同一客户的多个文档来弥补文档总数的不足

我选择声明式(查询)方法而不是命令式(游标和计数器)。这就是该WITH子句的用武之地。粗略地说,通过使用多个WITH块(CTE),我声明查询(我喜欢将它们视为临时视图)来为两种文档类型声明两个不同的目标集。最后,我将UNION不同 CTE 的子集作为最终结果,并执行一些COUNT检查来限制数量。

COUNT例如,多个 CTE 相互引用,并从上下文中的多个位置引用NOT EXISTS。我是SQL新手,WITH机缘巧合之下就选择了使用它。这是 的正确用例WITH还是反模式?与以命令式方式使用游标和计数器实现相同功能相比,该解决方案的性能如何?我是否选择了错误的方法?我们正在讨论具有数百万个条目的表。

这是整个查询。请原谅,由于保密原因,我不得不隐藏这些字段。

    WITH target_documents AS (
        SELECT
            <Necessary fields>
        FROM documents l
        WHERE
            <Suitable document criteria>
    ),
    target_documents_type_1 AS (
        SELECT * FROM target_documents WHERE type = 1
    ),
    target_documents_type_2 AS (
        SELECT * FROM target_documents WHERE type = 2
    ),
    target_customers AS (
        SELECT
            <Necessary fields>
        FROM customers …
Run Code Online (Sandbox Code Playgroud)

sql oracle performance common-table-expression

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

具有多个插入语句的 SQL Server CTE

我可以在 SQL Sever 中使用多个 CTE INSERT 表达式吗?

PostgreSQL 中允许这样做:

可写公共表表达式和多个插入语句

例如在 PostgreSQL 中。

with foo as 
(
      select * from ...
),
b as 
(
      insert into bar
          select * from foo
          returning *
)
insert into baz
    select * from foo;
Run Code Online (Sandbox Code Playgroud)

我在 SQL Server 中尝试过:

;WITH cte1 AS 
(
    SELECT * FROM Foo       
),
cte2 AS ( -- depends on cte1
    SELECT * FROM Bar WHERE ID IN (SELECT ID FROM cte1)
),
cte3 AS ( -- first insert …
Run Code Online (Sandbox Code Playgroud)

sql-server common-table-expression

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

具有多个删除语句的 SQL Server CTE

我有一个 CTE:

;WITH DeleteTarget AS
(
    ....
)
Run Code Online (Sandbox Code Playgroud)

我如何将此 CTE 用于两个删除语句 - 可能像:

DELETE FROM [TableA]
WHERE ColumnA IN (SELECT Id FROM DeleteTarget)

DELETE FROM [TableB]
WHERE ColumnB IN (SELECT Name FROM DeleteTarget)
Run Code Online (Sandbox Code Playgroud)

common-table-expression sql-server-2016

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

ORACLE (11.2.0.1.0) - 带有日期表达式的递归 CTE

以下问题的正确答案:

\n\n
    \n
  • 如果我没记错的话,这是一个在 11.2.0.3 或更高版本中修复的错误。(无论如何,11.2.0.1 不再受支持。11.2.0.4 是唯一仍受支持的 11.2 版本) \xe2\x80\x93 @a_horse_with_no_name
  • \n
  • Bug 编号为 11840579,已在 11.2.0.3 和 12.1.0.1\n\xe2\x80\x93 @a_horse_with_no_name 中修复
  • \n
\n\n

问题

\n\n

我有一张桌子

\n\n
CREATE TABLE test(\n  from_date date,\n  to_date date\n);\n\nINSERT INTO test(from_date,to_date)\n--VALUES(\'20171101\',\'20171115\');\nVALUES(TO_DATE(\'20171101\',\'YYYYMMDD\'),TO_DATE(\'20171115\',\'YYYYMMDD\'));\n
Run Code Online (Sandbox Code Playgroud)\n\n

Oracle 中的以下查询仅返回一行(预期 15 行)

\n\n
WITH dateCTE(from_date,to_date,d,i) AS(\n  SELECT from_date,to_date,from_date AS d,1 AS i\n  FROM test\n\n  UNION ALL\n\n  SELECT from_date,to_date,d+INTERVAL \'1\' DAY,i+1\n  FROM dateCTE\n  WHERE d<to_date\n)\nSELECT d,i\nFROM dateCTE\n
Run Code Online (Sandbox Code Playgroud)\n\n

SQL 小提琴 - http://sqlfiddle.com/#!4/36907/8

\n\n

为了测试我将条件更改为i<10

\n\n
WITH dateCTE(from_date,to_date,d,i) AS(\n  SELECT from_date,to_date,from_date AS …
Run Code Online (Sandbox Code Playgroud)

sql oracle common-table-expression

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

T-SQL层次结构查询

我有一个包含分层数据的表: 在此输入图像描述

这是包含 id、父 id、名称、代码(有时未填充)、级别和 isroot 列的数据示例。在实际场景中,级别会多于 2 个,但现在让我们看一下简化的示例。

我需要做的是循环遍历所有记录并查找在层次结构的任何级别上未填充 id 的行:

  • id 范围应从 6 到 10 返回,因为它们在层次结构的任何点都没有填充代码
  • 不应返回从 1 到 5 的行,因为在层次结构中的某处提到了代码。

如何使用 T-SQL 解决这个问题?

我想到的唯一解决方案是递归(cte 或 WHILE),但我试图实现的解决方案太复杂并且没有解决问题。

t-sql sql-server loops hierarchy common-table-expression

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

如何将 CTE 输出插入 Oracle 中的临时表?

在 Oracle 中,我尝试使用下面的代码将 CTE 的输出插入到临时表中,但出现错误。我不想提前创建临时表,它应该使用 CTE 中的列名和数据类型动态创建。

with cte as (
select ORDER_ID, STATUS_ID, CALL_DATE, SHIP_DATE,
       UPDATE_USER_ID,  UPDATE_TIMESTAMP,
       row_number() over(partition by ORDER_ID order by update_timestamp desc) as rowno 
FROM ORDER_HISTORY
where ORDER_ID in (1001,1002, 1003)
)
create table temp_recent_order as
select * from cte where rowno=1
Run Code Online (Sandbox Code Playgroud)

sql oracle ddl common-table-expression

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

PostgreSQL 12 CTE 物化选项何时提供优化优势?

编辑:我已将这个问题移至 ,因为dba.stackexchange我收到了建议,认为该社区可以更好地解决我的问题。

我一直在阅读有关 PostgreSQL 的新 CTE 功能 - MATERIALIZED 或 NOT MATERIALIZED 关键字 - 它可以在某些情况下提供额外的优化机会,前提是这样做是安全的。对此PostgreSQL 更新的评论如下:

...用户可以通过指定 MATERIALIZED 强制旧行为 [LESS OPTIMIZED];当查询故意使用WITH作为优化栅栏以防止计划选择不当时,这主要有用。

我一直想知道,考虑到在某种情况下使用 CTE 优化(不是 MATERIALIZED 关键字)是安全的,在这种情况下,优化程度较低的“MATERIALIZED”关键字可以“防止错误的计划选择”,如引用所述或提供更好的计划?

postgresql common-table-expression postgresql-12

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

在单个查询中获取分页行和总计数

核心需求:查找指定过滤条件, ,
的最新条目。可能有更多这样的过滤器,但无论如何,按提交日期返回最新的逻辑是相同的。有两个主要用途,一是在 UI 中分页查看,二是生成报告。person_idsubmission_datetypeplanstatus

WITH cte AS (
  SELECT * FROM (
    SELECT my_table.*, rank() OVER (PARTITION BY person_id ORDER BY submission_date DESC, last_updated DESC, id DESC) FROM my_table
    )  rank_filter 
      WHERE RANK=1 AND status in ('ACCEPTED','CORRECTED') AND type != 'CR' AND h_plan_id IN (10000, 20000)
)
SELECT
SELECT count(id) FROM cte group by id,
SELECT * FROM cte limit 10 offset 0;
Run Code Online (Sandbox Code Playgroud)

该方法group by也不适用于 CTE。计数查询中所有的联合null可能适用于组合,但不确定。

我想将这两个合并为1个查询的主要原因是因为表很大并且窗口函数很昂贵。目前我使用单独的查询,它们基本上都运行相同的查询两次。

Postgres 版本 12。 …

sql postgresql common-table-expression window-functions

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

在 MySQL (MariaDB) 中使用带有 CTE 的 UPDATE 的问题

我正在疯狂地尝试让 UPDATE 与 MySQL 中的 CTE 一起工作。

\n

这是一个简化的架构sa_general_journal

\n
CREATE TABLE `sa_general_journal` (\n  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `Transaction_ID` int(10) unsigned DEFAULT NULL COMMENT \'NULL if not split, same as ID for split records\',\n  `Date` timestamp NOT NULL DEFAULT current_timestamp(),\n\xe2\x80\xa6\n  `Statement_s` int(10) unsigned DEFAULT NULL,\n\xe2\x80\xa6\n  `Name` varchar(255) DEFAULT NULL,\n\xe2\x80\xa6\n  PRIMARY KEY (`ID`),\n\xe2\x80\xa6\n) ENGINE=InnoDB AUTO_INCREMENT=25929 DEFAULT CHARSET=utf8;\n
Run Code Online (Sandbox Code Playgroud)\n

某些记录是“拆分”的,例如,信用卡对帐单金额可能包含拆分的销售税金额。在这种情况下,拆分记录的两个部分在 Transaction_ID 字段中具有相同的 ID。

\n

批量导入记录时,它们无法引用last_insert_ID填写 Transaction_ID 字段,因此需要随后清理这些记录。

\n

这是我第一次天真的尝试,它说我在附近有一个错误UPDATE。好吧,呃。

\n
WITH cte AS (\n …
Run Code Online (Sandbox Code Playgroud)

mysql common-table-expression mariadb sql-update

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