惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
F
Fortinet All Blogs
爱范儿
爱范儿
博客园 - Franky
MyScale Blog
MyScale Blog
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
B
Blog
P
Proofpoint News Feed
IT之家
IT之家
宝玉的分享
宝玉的分享
D
DataBreaches.Net
S
SegmentFault 最新的问题
Microsoft Azure Blog
Microsoft Azure Blog
GbyAI
GbyAI
M
MIT News - Artificial intelligence
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
雷峰网
雷峰网
Stack Overflow Blog
Stack Overflow Blog
量子位
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

szhshp 的第三边境研究所

假设, AI 把我代替的那一刻真的到来 | szhshp 的第三边境研究所 小傻瓜都能懂的 AstrBot QQ 机器人集成 MCP 功能实战指南 | szhshp 的第三边境研究所 《智人之上: 从石器时代到 AI 时代的信息网络简史》阅读笔记 | szhshp 的第三边境研究所 iPadOS 26 无法设置空间场景图片壁纸的解决方法 | szhshp 的第三边境研究所 《一路云海》(终) | szhshp 的第三边境研究所 《一路云海》(四): 如何不按套路旅行 | szhshp 的第三边境研究所 《一路云海》(三): In Ya Mellow Tone | szhshp 的第三边境研究所 《一路云海》(二): 关西世博参观纪实 | szhshp 的第三边境研究所 《一路云海》(一): 新的征程 | szhshp 的第三边境研究所 2025 大阪世博会 [ 3 天前-先到先得 ] 阶段 场馆预约必中独家攻略 | szhshp 的第三边境研究所 Hackathon 随想 | szhshp 的第三边境研究所 一杯双皮奶 | szhshp 的第三边境研究所 Armbian + CasaOS + NAS 配置指南 | szhshp 的第三边境研究所 Docker 构建镜像报错: error getting credentials - err: exit status 1, out: `` | szhshp 的第三边境研究所 Disqus RIP! 论过高的维护成本如何治疗固执的坏习惯 | szhshp 的第三边境研究所 炸弹猫桌游变体规则 | szhshp 的第三边境研究所 《小岛经济学》阅读笔记 | szhshp 的第三边境研究所 《金钱心理学》阅读笔记 | szhshp 的第三边境研究所 为知笔记 RIP: 迁移剩余的笔记 | szhshp 的第三边境研究所 2025 博客第十年展望 - 再见我的过去 | szhshp 的第三边境研究所 我在独立游戏里面致敬的作品 | szhshp 的第三边境研究所 《How to make thing faster》阅读笔记 | szhshp 的第三边境研究所 《The Art of Clean Code》阅读笔记 | szhshp 的第三边境研究所 《Clean Architecture: A Craftsman Guide to Software Structure and Design》阅读笔记 | szhshp 的第三边境研究所 《How AI Works》阅读笔记 | szhshp 的第三边境研究所 游戏策划废案 - Project Uranus | szhshp 的第三边境研究所 游戏策划废案 - Project X | szhshp 的第三边境研究所 人生第一款独立游戏开发复盘 | szhshp 的第三边境研究所 Trap of Life | szhshp 的第三边境研究所 如果我用手搓了个暗物质雏形 | szhshp 的第三边境研究所
SQL2012里面一些很实用的功能 | szhshp 的第三边境研究所
2016-10-24 · via szhshp 的第三边境研究所

Meta

目录

最近开发部换了2012, 相比05真是有很多提升, 特别是多出了一些高效率的关键字

然后后台的大部分query都要重写是闹哪样闹哪样闹哪样(ーー゛)

Merge

Desc

类似如下的需求:

对数据表Table插入对应的数据Data

如果Table中存在,而Data中也存在的数据则将其激活(set archived = 0)

如果Table中不存在,而Data中存在的数据则插入Table

需求可以进行扩展:

如果Table中存在,而在Data中不存在的数据则从Table中删除(set archived = 1)

Merge

如果用旧版本的SQL可能需要各种Join,Exists,Insert,Update,Delete

但是实际上用一条含有Merge的关键字就可以实现这样的需求

用法可以参考MS的API1

Example

declare @MergeFrom as table(
    a integer
)

declare @MergeTo as table(
    a integer,
    archived integer
)

insert into @MergeFrom values (2)
insert into @MergeFrom values (3)
insert into @MergeFrom values (4) /*will be inserted */

insert into @MergeTo values(1,0) /*will be archived */
insert into @MergeTo values(2,0)
insert into @MergeTo values(3,1) /*will be updated*/


/* Before merge */
select * 
    from @MergeTo

merge into @MergeTo as t
using @MergeFrom as f
    on t.a = f.a
when matched
    /* matched: these record are in use, set not archived */
    then update set t.archived = 0 
when not matched 
    /* record not matched in @MergeFrom: insert into @MergeFrom */
    then insert values(f.a, 0) 
when not matched by source
    /*record not matched in @MergeFrom:*/
    then delete; 

/* after Merge */
select * 
    from   @MergeTo
  • 这里对于when 之后的条件可以进行扩展, 比如添加AND 或者其他条件等等
  • Merge后面也可以添加各种select的修饰符, 比如top等等

运行结果

merge 里面使用 output

一个 merge 语句可能非常复杂

因此偶尔我们需要将变化了的结果输出或者存放日志到其他地方

这时候可能就会用到 output

merge into pcc_attributeDeterm t  
using zAssessResult_AllRequiredType f  
on t.attributeID = f.attributeID 

when matched
then update set 
    ...     

when not matched  
then insert values(
    ...

)
output

'AttributeDeterm' RefType
,  INSERTED.PCC_AttributeDetermID RefID
,  CASE WHEN ($action = 'INSERT') THEN 'Created' ELSE 'Updated' END as ActionType
,  '' ActionDesc
,   'System Determination' ActionBy
,  INSERTED.SysDetermDate ActionDate

INTO dbo.ActionLog;
  • 不能使用 UPDATED 关键字, 修改的数据全部都出现在 INSERTED 里面
  • 只能同时出现一个 OUTPUT + INTO, 全部语句结尾还能再 OUTPUT 但是这个 OUTPUT 不能带有 INTO

也就是:

output
xxx
INTO dbo.ActionLog
output
xxx
--INTO dbo.ActionLog2; -- 不能同时使用俩INTO

limit & offset

这个分页功能其实很早就有需求了, 也不知道为何到2012才引入这个关键字

以前在DB端进行分页需要首先筛选出所有列, 然后根据index进行二次筛选

当然这儿的第一步筛选所有列就已经很影响效率, offset就可以解决这个问题

Example2

用法及其简单, 放在Order后方即可

SELECT First Name + ' ' + Last Name 
FROM Employees 
ORDER BY First Name 
OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;

参考文献

  1. MERGE (Transact-SQL)

  2. OFFSET FETCH 子句 (SQL Server Compact)