【解惑】介绍三大数据库的with语句的写法及使用场景

解惑,介绍,数据库,with,语句,写法,使用,场景 · 浏览次数 : 115

小编点评

**MySQL** ```sql WITH max_price AS ( SELECT item_type, MAX(s_price) AS m_price FROM table1 GROUP BY item_type ) SELECT a.col1, a.col2 FROM table1 a INNER JOIN max_price ON a.item_type = max_price.item_type WHERE a.s_price = (SELECT m_price FROM max_price t1 WHERE t1.item_type = a.item_type); ``` **Microsoft SQL Server (MSSQL)** ```sql WITH max_price AS ( SELECT item_type, MAX(s_price) AS m_price FROM table1 GROUP BY item_type ) SELECT a.col1, a.col2 FROM table1 a WHERE a.s_price = (SELECT m_price FROM max_price t1 WHERE t1.item_type = a.item_type); ``` **Oracle** ```sql WITH max_price AS ( SELECT item_type, MAX(s_price) AS m_price FROM table1 GROUP BY item_type ) SELECT a.col1, a.col2 FROM table1 a WHERE a.s_price = (SELECT m_price FROM max_price t1 WHERE t1.item_type = a.item_type); ```

正文

WITH 子句通常被称为 "Common Table Expressions"(CTE),俗称内存临时表,当使用 WITH 语句时,应注意具体的数据库版本和支持情况。以下是对 MySQL、Microsoft SQL Server(MSSQL)和 Oracle 数据库的 WITH 语句用法示例,以及在 WHERE 子句中添加分组关联条件实现对比最大聚合值:

MySQL

在 MySQL5.7 中,可以使用子查询和连接操作来实现 WITH 语句的效果,并结合 GROUP BY 子句实现分组关联条件,但是性能较低,因为每行a.s_price都需要与子查询max(s_price)聚合对比,结果集超过1万行就慢了。以下是示例代码:

SELECT a.col1, a.col2
FROM table1 a
INNER JOIN (
    SELECT item_type, MAX(s_price) AS m_price
    FROM table1
    GROUP BY item_type
) AS max_price ON a.item_type = max_price.item_type
WHERE a.s_price = max_price.m_price;

在MySQL8.0及以上版本,可以使用with语法实现上述功能,且性能较高:

WITH max_price AS (
    SELECT item_type, MAX(s_price) AS m_price
    FROM table1
    GROUP BY item_type
)
SELECT a.col1, a.col2
FROM table1 a
WHERE a.s_price = (SELECT m_price FROM max_price t1 WHERE t1.item_type = a.item_type);

Microsoft SQL Server (MSSQL)

在 MSSQL 中,可以使用 WITH 语句(也称为公共表表达式)来在查询中定义临时的命名结果集,并在 WHERE 子句中添加分组关联条件。以下是示例代码:

WITH max_price AS (
    SELECT item_type, MAX(s_price) AS m_price
    FROM table1
    GROUP BY item_type
)
SELECT a.col1, a.col2
FROM table1 a
WHERE a.s_price = (SELECT m_price FROM max_price t1 WHERE t1.item_type = a.item_type);

此 WITH 语句在 MSSQL 2005 及以上版本中可用。

Oracle

在 Oracle 中,WITH 语句通常被称为子查询块或子查询事务,它使用 WITH 子句为查询定义临时命名的数据块,并在 WHERE 子句中添加分组关联条件。以下是示例代码:

WITH max_price AS (
    SELECT item_type, MAX(s_price) AS m_price
    FROM table1
    GROUP BY item_type
)
SELECT a.col1, a.col2
FROM table1 a
WHERE a.s_price = (SELECT m_price FROM max_price t1 WHERE t1.item_type = a.item_type);

此 WITH 语句在 Oracle 9i 及以上版本中可用。

需要注意的是,这些示例是通用的语法示例,不能适用于所有情况。具体使用和限制还需要参考各个数据库的官方文档或进一步研究各个数据库管理系统的特定语法和功能。

与【解惑】介绍三大数据库的with语句的写法及使用场景相似的内容:

【解惑】介绍三大数据库的with语句的写法及使用场景

WITH 子句通常被称为 "Common Table Expressions"(CTE),俗称内存临时表,当使用 WITH 语句时,应注意具体的数据库版本和支持情况。以下是对 MySQL、Microsoft SQL Server(MSSQL)和 Oracle 数据库的 WITH 语句用法示例,以及在

【解惑】介绍.net中的DataTable的AcceptChanges方法

`DataTable.AcceptChanges`方法是一个用于`DataTable`对象的方法,它将所有对`DataTable`进行的更改标记为已接受。这意味着所有新增、修改和删除的行都将被标记为`DataRowState.Unchanged`,并且`DataTable`对象的`HasChange

【解惑】当处理同一个字段的并发问题时,使用乐观锁来处理库存数量

以下是一个使用乐观锁处理库存数量并发问题的c#示例代码: ```csharp using System; using System.Data; using System.Data.SqlClient; public class InventoryService { private string co

【解惑】孜孜不倦,用足球赛程详解c#中的yield return用法

在一个知名企业赞助的足球联赛中,有256支球队参赛。为了确保比赛的顺利进行,企业指派了小悦负责熬夜加班制定每一个球队的赛程。尽管她对足球的了解并不多,但是她对待工作的认真态度却让人钦佩。 在小悦的努力下,她顺利完成了第一轮、第二轮和第三轮的比赛安排。然而,在大赛开始前的模拟比赛中,她发现了一个严重的

【解惑】时间规划,Linq的Aggregate函数在计算会议重叠时间中的应用

在繁忙的周五,小悦坐在会议室里,面前摆满了各种文件和会议安排表。她今天的工作任务是为公司安排下周的50个小会议,这让她感到有些头疼。但是,她深吸了一口气,决定耐心地一个一个去处理。 首先,小悦仔细地收集了每个会议的相关信息,包括会议的主题、目的、预计参加人数、所需设备和预计的开始和结束时间等。她需要

[转帖]RabbitMQ erlang.cookie解惑

https://www.cnblogs.com/xgtx/articles/6068392.html 在搭建RabbitMQ集群的时候往往会因为.erlang.cookie而报各种错误,网上查资料也会经常说.erlang.cookie会在$home下,或者在/var/lib/rabbitmq下,到底

[转帖] 字符编码解惑

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 现代编程语言都抽象出了String字符串这个概念,注意它是一个高级抽象,但是计算机中实际表示信息时,都是用的字节,所以就需要一种机制,让字符串与字节之间可以相互转换,这种转换机制就是字符编码,如GBK,UTF-8

[转帖]字符编码解惑

https://www.cnblogs.com/codelogs/p/16060234.html 简介# 现代编程语言都抽象出了String字符串这个概念,注意它是一个高级抽象,但是计算机中实际表示信息时,都是用的字节,所以就需要一种机制,让字符串与字节之间可以相互转换,这种转换机制就是字符编码,如

聊一聊如何截获 C# 程序产生的日志

一:背景 1.讲故事 前段时间分析了一个dump,一顿操作之后,我希望用外力来阻止程序内部对某一个com组件的调用,对,就是想借助外力实现,如果用 windbg 的话,可以说非常轻松,但现实情况比较复杂,客户机没有windbg,也不想加入任何的手工配置,希望全自动化来处理。 真的很无理哈。。。不过这

《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(6)-Charles安卓手机抓包大揭秘

1.简介 Charles和Fiddler一样不但能截获各种浏览器发出的 HTTP 请求,也可以截获各种智能手机发出的HTTP/ HTTPS 请求。 Charles也能截获 Android 和 Windows Phone 等设备发出的 HTTP/HTTPS 请求。 今天宏哥讲解和分享Charles如何