首页 > 数据库 >sql-server公用表表达式

sql-server公用表表达式

时间:2024-09-11 14:51:48浏览次数:3  
标签:... TransactionDate UserId server CTE 表达式 sql Id SELECT

视图是作为数据库对象存储在数据库中的,如果这个结果集仅仅要使用一次,那么建立视图就太奢侈了。

在SQL Server中,公共表表达式(Common Table Expression,简称CTE)是一种临时的结果集,可以在一个查询块中多次引用。CTE可以用来简化复杂的查询,特别是那些需要多步操作或者递归查询的情况。下面是一个详细的介绍,包括CTE的语法和使用示例。

WITH 公用表名 [(自定列名表)] AS
(SELECT...)

注意,公用表表达式只能且必须在后面的一个SELECT/INSERT/UPDATE/DELETE/MERGE语句中使用,但这条语句未结束时可以多次使用,结束后就失效了。

WITH CTE_Name (Column1, Column2, ...) AS (
    -- CTE 的定义
    SELECT ...
    FROM ...
    WHERE ...
    GROUP BY ...
    HAVING ...
    ORDER BY ...
)
-- 正常的 SQL 查询
SELECT ...
FROM ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...

示例 1: 简单的CTE

假设我们有一个包含用户信息的表Users,并且想要创建一个CTE来计算每个用户的积分总和。

WITH UserPoints AS (
    SELECT
        U.Id,
        SUM(P.Points) AS TotalPoints
    FROM
        Users U
    JOIN
        PointsTransactions P ON U.Id = P.UserId
    GROUP BY
        U.Id
)
SELECT
    U.Username,
    UP.TotalPoints
FROM
    Users U
JOIN
    UserPoints UP ON U.Id = UP.Id
ORDER BY
    UP.TotalPoints DESC;

示例 2: 使用多个CTE

WITH PointType AS (
    SELECT Id
    FROM PointTypes
    WHERE TypeName = '购物积分'
),
UserPoints AS (
    SELECT
        U.Id AS UserId,
        SUM(PT.Points) AS TotalPoints
    FROM
        Users U
    JOIN
        PointsTransactions PT ON U.Id = PT.UserId
    JOIN
        PointType PTy ON PT.PointTypeId = PTy.Id
    GROUP BY
        U.Id
)
SELECT
    U.Username,
    UP.TotalPoints
FROM
    Users U
JOIN
    UserPoints UP ON U.Id = UP.UserId
ORDER BY
    UP.TotalPoints DESC;

PointType CTE:获取“购物积分”类型的ID。
UserPoints CTE:计算每个用户在“购物积分”类型的积分总和。
最终查询:将用户表与UserPoints CTE连接,并按积分总和降序排列。

示例 3: 使用多个CTE

WITH InitialPoints AS (
    SELECT
        U.Id AS UserId,
        PH.TransactionDate AS TransactionDate,
        PH.PointsBefore AS Points
    FROM
        Users U
    JOIN
        PointsHistory PH ON U.Id = PH.UserId
    WHERE
        PH.TransactionDate = (
            SELECT MIN(TransactionDate)
            FROM PointsHistory
            WHERE UserId = U.Id
        )
),
RecursivePoints AS (
    SELECT
        U.Id AS UserId,
        PH.TransactionDate AS TransactionDate,
        PH.PointsAfter AS Points
    FROM
        Users U
    JOIN
        PointsHistory PH ON U.Id = PH.UserId
    WHERE
        PH.TransactionDate > (
            SELECT TransactionDate
            FROM InitialPoints I
            WHERE I.UserId = U.Id
        )
)
SELECT
    U.Username,
    IP.TransactionDate,
    IP.Points
FROM
    Users U
JOIN
    InitialPoints IP ON U.Id = IP.UserId
UNION ALL
SELECT
    U.Username,
    RP.TransactionDate,
    RP.Points
FROM
    Users U
JOIN
    RecursivePoints RP ON U.Id = RP.UserId
ORDER BY
    U.Username, IP.TransactionDate;

InitialPoints CTE:查找每个用户的首次积分变动记录,并记录当时的积分余额。
RecursivePoints CTE:查找每个用户之后的所有积分变动记录,直到没有更多的记录为止。
最终查询:将用户表与InitialPoints CTE结合,并按用户名和交易日期排序输出结果。同时,也将递归部分的结果合并进来。

注意:递归CTE必须有一个明确的终止条件,否则可能会导致无限循环。

这种递归CTE的使用方式非常适合处理具有层次结构的数据,比如组织架构、文件系统路径等。通过递归CTE,可以方便地查询和展示出整个层次结构。

标签:...,TransactionDate,UserId,server,CTE,表达式,sql,Id,SELECT
From: https://blog.csdn.net/weixin_47363690/article/details/142138856

相关文章

  • Java中的安全编码实践:如何防止SQL注入与XSS攻击
    Java中的安全编码实践:如何防止SQL注入与XSS攻击大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java开发中,安全编码是确保应用程序免受攻击的关键因素。SQL注入和跨站脚本攻击(XSS)是最常见的安全漏洞之一。本文将介绍如何在Java中防止这两种攻击,并提......
  • SQL Server 很慢很卡?
    1、可以试着查找影响数据库性能的SQL语句SELECTTOP30total_worker_time/1000AS[CPU总耗时(ms)],execution_count[运行次数],qs.total_worker_time/qs.execution_count/1000AS[CPU平均耗时(ms)],last_execution_timeAS[最后执行时间],max_worker_time/1000AS......
  • 基于Java+Vue+Mysql的人力资源管理系统:简单易用,高效协同(项目代码)
    前言:eHR(ElectronicHumanResources)人力资源管理系统是一个综合性的软件平台,用于管理组织的人力资源相关的各种活动和数据。该系统可以显著提高人力资源部门的工作效率,确保数据准确性和一致性,同时提供决策支持。以下是eHR人力资源管理系统的六个主要模块及其功能的简要介绍:......
  • Active Directory Server Build
    ActiveDirectoryServerBuildDocument Preparedfor:LeanDevelopmentPtyLtd 5.ComputerSettings1.2.3.4.5.5.1.GeneralSettingsGeneralsettingsasrecordedin‘ControlPanel/System’arepresentedbelow:<Inserttherequiredserverscreenshotth......
  • Windows Server 2022 rdp
    继续水一篇:2022废弃了xddm转而使用wddm,rdp的渲染有比较大的变化。高版本的unreal又需要2022支持,被迫走上魔改windows以提升2022rdp环境下抓屏帧数的道路。测试代码来自https://github.com/robmikh/Win32CaptureSample,只手动添加了输出fps逻辑。patchwindows后能在[60,90]......
  • MySQL 8.0 低并发性能惊人反转:优化后的显著提升
    sysbench读写测试,目的是测试低并发情况下的性能对比:并发 官方8.0版本    8.0改进版本    5.7      8.0改进版本比5.7提升性能 1     1191        2432          1337      2432/1337=......
  • asp.netcore8 + vue3 + mysql 自用记账项目(四)项目部署
    一、生成后台api服务 1、在系统生成的Dockerfile基础上,添加时区标识FROMmcr.microsoft.com/dotnet/aspnet:8.0ASbaseENVTZAsia/ShanghaiRUNln-snf/usr/share/zoneinfo/$TZ/etc/localtime&&echo$TZ>/etc/timezoneWORKDIR/appEXPOSE80EXPOSE443FROMmcr.......
  • asp.netcore8 + vue3 + mysql 自用记账项目(二)环境搭建
    一、vue1、node.js安装安装node.js的攻略网上有很多,这里就不多做赘述,安装完成后,验证是否正常然后就是配置淘宝镜像加速,配置环境变量等操作。2、vue安装上面安装完node.js之后,就可以安装vue环境了,网上同样很多,需要注意的是,vue安装完成了,最好将webpack模版、vue-cli、vue-rout......
  • asp.netcore8 + vue3 + mysql 自用记账项目(三)功能开发
    一、前端前端使用vue3+vant4组件实现页面功能。 1、创建vue3项目各个操作分别是:选择创建模式?手动创建选择项目模块?Babel,Kouter,Wuex,CSSPreprocessors选择vue版本?3.0是否使用历史路由模式?是样式的写法?Less项目配置放在哪?package.json文件里是否保存本次......
  • asp.netcore8 + vue3 + mysql 自用记账项目(一)背景简介
    一、背景18年的时候,用了一年多第三方免费的记账本不用了,两个方面原因,一是随着数据增多,APP用着越来越慢,二是相关数据被用于其他用途的风险很大且广告很烦。所以,后面通过MUI+asp.netcore+sqlserver实现记账web功能,在阿里云1核2G服务器的windows系统上发布了自用的服务,最......