SQL 数据匹配更新
萌新的成长之路!
最近遇到的一个需求是需要将两张关联的表的数据进行匹配(dbo.SystemUser【系统用户表】;dbo.V_Temp【系统权限视图】),即通过匹配用户ID与系统ID(拥有的系统ID即为该用户拥有对应的系统权限)进行判断,数据流走方向为 视图(以下简称V)——》用户表(以下简称T)。有如下情况,情况一:如果 T里不存在 V 的数据则将该数据插入 T(此处有拥有用户ID匹配但系统ID不匹配和完全不匹配的情况),如果互相匹配则不进行操作;情况二:用户ID和系统ID同时匹配,但是密码不匹配(存在可以确定的加密密码和未加密的密码),此时需要将密码更新(此处拥有V 密码加密后与 T密码仍不匹配的情况,此时即为需要更新)。
大概需求如上,思前想后通过存储过程来完成。因为走入了误区所以一直写少了一个判断条件,如下
SELECT vb.staffID,
vb.systemID,
vb.staffID,
vb.pwd,
FROM dbo.V_Temp vb
LEFT JOIN dbo.SystemUser sm
ON vb.staffID = sm.UserID
AND vb.systemID = sm.SystemID
这样使用 join 连接会有重复的数据出现的问题,一直很苦恼又无法理通思路,然后前辈给帮忙理了一下思路后豁然开朗:当数据进行匹配的时候只要不存在即为需要进行插入操作的前提条件,所以 join 后查出来有为 NULL 的数据则其一定是需要进行插入操作的记录。那在什么地方做判断呢?肯定是接着写一个 where判断。(因为之前萌新以为join连接的 on已经将判断做完了所以便没有深入的想到还可以继续做where 判断,以后要牢记教训)这里还有一个坑就是:SQL 里对 NULL 值进行判断不能使用 符号 (=、!= 、<>),只能使用 (IS、IS NOT)来进行判断。
修改之后多次测试,终于可以成功执行了,当然插入写出来了,更新也就跟着一起变得简单了。代码贴图如下,仅供参考:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO -- =============================================
-- Author: 兔姬呀
-- Create date: 2018.06.12
-- Description: 喵喵喵
--不存在则进行 insert 操作
--存在匹配则比对密码,密码不同则更新
-- ============================================= ALTER PROC [dbo].[SP_BP]
AS
BEGIN INSERT INTO dbo.SystemUser
(
UserID,
SystemID,
SystemUserID,
Password
)
SELECT vb.staffID,
vb.systemID,
vb.staffID,
vb.pwd,
FROM dbo.V_Temp vb
LEFT JOIN dbo.SystemUser sm
ON vb.staffID = sm.UserID
AND vb.systemID = sm.SystemID
WHERE sm.UserID IS NULL UPDATE dbo.SystemUser
SET Password = dbo.fun_encrypt(vb.pwd)
FROM dbo.SystemUser sm,
dbo.V_Temp vb
WHERE vb.staffID = sm.UserID
AND vb.systemID = sm.SystemID
AND dbo.fun_encrypt(vb.pwd) != sm.Password END;
用前辈的话来说,这些都是很基础的问题,仔细想一下真是为自己的技术着急。的确就因为一个 where 判断没写就导致了整个功能的实现耽误了3天(汗(⊙﹏⊙)b已经严重超出功能开发的标准日期了,而且这还是只算一个简单的SQL语句)。反思自己之前真的是没认真在对待,以后一定要改正,对于细节也更要注意!
萌新的这个坑已经填完了,写博客就像写日记一样,不光是为了记录自己学到的东西,也为了能够让自己更清楚哪些地方不足,以后多注意,也互相共勉!
SQL 数据匹配更新的更多相关文章
- Database基础(三):SQL数据导入/导出、 操作表记录、查询及匹配条件
一.SQL数据导入/导出 目标: 使用SQL语句完成下列导出.导入操作: 将/etc/passwd文件导入userdb库userlist表并给每条记录加编号 将userdb库userlist表中UID ...
- [SQL基础教程] 4-3 数据的更新(UPDATE)
[SQL基础教程] C4 数据更新 4-3 数据的更新(UPDATE) UPDATE UPDATE <表名> SET <列名> = <表达式>; UPDATE &l ...
- 【mybatis】mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wait timeout exceeded; try restarting transaction
今天使用mybatis和jpa的过程中,发现这样一个问题: mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wai ...
- 在论坛中出现的比较难的sql问题:9(触发器专题 插入数据自动更新表数据)
原文:在论坛中出现的比较难的sql问题:9(触发器专题 插入数据自动更新表数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所 ...
- SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据
SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...
- SQL基础教程(第2版)第4章 数据更新:4-3 数据的更新(UPDATE)
第4章 数据更新:4-3 数据的更新(UPDATE) ● 使用UPDATE语句可以更改(更新)表中的数据.● 更新部分数据行时可以使用WHERE来指定更新对象的条件.通过WHERE子句指定更新对象的U ...
- SQLite支持的SQL数据操作
事务处理 Posted on 2013 年 1 月 1 日 by 林溪 事务为一组SQL命令的集合,这些SQL命令在执行时不可进行分割,即要么全部执行这些SQL命令,要么一个都不进行执行,事务操作 ...
- Kettle中通过触发器方式实现数据 增量更新
在使用Kettle进行数据同步的时候, 共有 1.使用时间戳进行数据增量更新 2.使用数据库日志进行数据增量更新 3.使用触发器+快照表 进行数据增量更新 今天要介绍的是第3中方法. 实验的思路是这样 ...
- JAVA基础之sql模糊匹配、外键以及jsp中include的用法
一.SQL模糊匹配 适用于对字符串进行模糊搜索 格式: 字段名 Like '%关键词%' % 表示这个位置可有任意个字符(没有也可以) %关键词% 只要包含关键词就算 ...
随机推荐
- 【算法笔记】B1015 德才论
1015 德才论 (25 分) 宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君 ...
- 洛谷 P3616 富金森林公园题解(树状数组)
P3616 富金森林公园 题目描述 博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N.每一个巨石有一个海拔高度.而这个山脉又在一个盆地中,盆地里可能会积水,积水也有 ...
- mysql允许数据库远程连接
2018-11-06 进入数据库 mysql -uroou(用户) -p123456(密码) 授权某个user可远程访问 grant all privileges on *.* to ' with g ...
- U盘安装CentOS 7错误 /dev/root does not exist, could not
问题: U盘安装CentOS 7,显示/dev/root does not exist, could not boot 解决方法: 1. 到windows里面查看U盘名称(例如 "Cento ...
- js动态实现时分秒
<div id="time" style="color: #96C2DD;</div> <script type="text/ ...
- TabLayout实现底部导航栏(2)
TabLayout是android.support.design里的一个控件,使用它可以很方便的做出顶部导航和底部导航.类似于这样的,能设置选中时字体的颜色和选中时的图片. 效果如图: 首先我们在 b ...
- 接口隔离原则(Interface Segregation Principle)ISP
using System; using System.Collections.Generic; using System.Text; namespace InterfaceSegregationPri ...
- (转)10 分钟内快速构建能够承载海量数据的 nginx 日志分析与报警平台
10 分钟内快速构建能够承载海量数据的 nginx 日志分析与报警平台 原文:https://blog.qiniu.com/archives/8713
- Spring混合配置时,遇到配置文件路径NotFound,使用PathMatchingResourcePatternResolver解决
在将spring的xml配置改为java配置的过程中,遇到了一些问题,block时间比较长的一个问题是资源(.xml, .properties)的路径找不到,最后是使用PathMatchingReso ...
- 【shell】《shell学习指南》读书笔记
一.使用shell脚本 优点:脚本语言能够轻易处理文件与目录之间的对象,如把文件从所有目录拷贝到另一个目录 缺点:效率不如编译型语言 二.简单的脚本 1.查看现在系统有谁登录 $who 2.算出行数 ...