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 '%关键词%' % 表示这个位置可有任意个字符(没有也可以) %关键词% 只要包含关键词就算 ...
随机推荐
- 静态区间第K小(整体二分、主席树)
题目链接 题解 主席树入门题 但是这里给出整体二分解法 整体二分顾名思义是把所有操作放在一起二分 想想,如果求\([1-n]\)的第\(k\)小怎么二分求得? 我们可以二分答案\(k\), \(O(n ...
- Flask之flask-script 指定端口
简介 Flask-Scropt插件为在Flask里编写额外的脚本提供了支持.这包括运行一个开发服务器,一个定制的Python命令行,用于执行初始化数据库.定时任务和其他属于web应用之外的命令行任务的 ...
- 【字符串】【hash】【倍增】洛谷 P3502 [POI2010]CHO-Hamsters 题解
这是一道字符串建模+图论的问题. 题目描述 Byteasar breeds hamsters. Each hamster has a unique name, consisting of lo ...
- python数据结构与算法之list
1. 数据结构的操作 作为一种包含元素的数据结构,需要提供一些“标准”操作: 创建和销毁 判断是否空,如果容量有限,还需判断是否满 向结构中加入元素或从中删除 访问结构里的元素 不同的编程语言可能影响 ...
- HDU6395(分段+矩阵快速幂)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=6395 给你一个式子,给出你A,B,C,D,P,n,让你求出第n项的式子Fn.(其中ABCDPn均在1e9的 ...
- [转] 完全卸载删除gitlab
[From] https://yq.aliyun.com/articles/114619 完全卸载删除gitlab 1.停止gitlab gitlab-ctl stop 2.卸载gitlab(注意这里 ...
- JS禁用浏览器退格键实现思路及代码
[From] http://www.jb51.net/article/42562.htm 上周提交了一个项目(内部使用的),一同事提出个BUG,说要禁用退格键(backspace或者叫后退键),因为这 ...
- 【记录】dvwa总结
一.Brute Force 选择集束炸弹 设置payload stack attck 防御:密码加密,使用验证码,使用统一的参数代替帐号和密码. 二.Command Injection |,||,&a ...
- SQL注入(过滤空格和--+等注释符)
1.地址:http://ctf5.shiyanbar.com/web/index_2.php(过滤了空格和--+等注释符) 思路:确定注入参数值类型,直接输入单引号,根据报错信息确定参数值类型为字符型 ...
- js 递归思想 处理后台多维数组的数据 之 完美契合
不多BB! 直接看源码 get(tree = []) { let self = this let arr = []; if (!!tree && tree.length !== 0) ...