我正在尝试生成一些具有不同嵌套级别的 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) 我必须执行涉及多个深度连接和复杂谓词的相对复杂的查询,其中结果(和条件)取决于满足条件的合适条目。涉及主要和次要标准,始终应用主要标准,如果结果不令人满意,则进行次要打击。简而言之
但如果没有足够的不同文档类型或不同客户的文档,请尝试仍然满足 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 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) 我有一个 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) 以下问题的正确答案:
\n\n问题
\n\n我有一张桌子
\n\nCREATE 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\'));\nRun Code Online (Sandbox Code Playgroud)\n\nOracle 中的以下查询仅返回一行(预期 15 行)
\n\nWITH 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\nRun Code Online (Sandbox Code Playgroud)\n\nSQL 小提琴 - http://sqlfiddle.com/#!4/36907/8
\n\n为了测试我将条件更改为i<10
WITH dateCTE(from_date,to_date,d,i) AS(\n SELECT from_date,to_date,from_date AS …Run Code Online (Sandbox Code Playgroud) 这是包含 id、父 id、名称、代码(有时未填充)、级别和 isroot 列的数据示例。在实际场景中,级别会多于 2 个,但现在让我们看一下简化的示例。
我需要做的是循环遍历所有记录并查找在层次结构的任何级别上未填充 id 的行:
如何使用 T-SQL 解决这个问题?
我想到的唯一解决方案是递归(cte 或 WHILE),但我试图实现的解决方案太复杂并且没有解决问题。
在 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) 编辑:我已将这个问题移至 ,因为dba.stackexchange我收到了建议,认为该社区可以更好地解决我的问题。
我一直在阅读有关 PostgreSQL 的新 CTE 功能 - MATERIALIZED 或 NOT MATERIALIZED 关键字 - 它可以在某些情况下提供额外的优化机会,前提是这样做是安全的。对此PostgreSQL 更新的评论如下:
...用户可以通过指定 MATERIALIZED 强制旧行为 [LESS OPTIMIZED];当查询故意使用WITH作为优化栅栏以防止计划选择不当时,这主要有用。
我一直想知道,考虑到在某种情况下使用 CTE 优化(不是 MATERIALIZED 关键字)是安全的,在这种情况下,优化程度较低的“MATERIALIZED”关键字可以“防止错误的计划选择”,如引用所述或提供更好的计划?
核心需求:查找指定过滤条件, ,
的最新条目。可能有更多这样的过滤器,但无论如何,按提交日期返回最新的逻辑是相同的。有两个主要用途,一是在 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。 …
我正在疯狂地尝试让 UPDATE 与 MySQL 中的 CTE 一起工作。
\n这是一个简化的架构sa_general_journal:
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;\nRun Code Online (Sandbox Code Playgroud)\n某些记录是“拆分”的,例如,信用卡对帐单金额可能包含拆分的销售税金额。在这种情况下,拆分记录的两个部分在 Transaction_ID 字段中具有相同的 ID。
\n批量导入记录时,它们无法引用last_insert_ID填写 Transaction_ID 字段,因此需要随后清理这些记录。
这是我第一次天真的尝试,它说我在附近有一个错误UPDATE。好吧,呃。
WITH cte AS (\n …Run Code Online (Sandbox Code Playgroud) sql ×4
oracle ×3
postgresql ×2
sql-server ×2
t-sql ×2
ddl ×1
for-xml ×1
hierarchy ×1
loops ×1
mariadb ×1
mysql ×1
performance ×1
sql-update ×1