萌新的成长之路!

  最近遇到的一个需求是需要将两张关联的表的数据进行匹配(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 数据匹配更新的更多相关文章

  1. Database基础(三):SQL数据导入/导出、 操作表记录、查询及匹配条件

    一.SQL数据导入/导出 目标: 使用SQL语句完成下列导出.导入操作: 将/etc/passwd文件导入userdb库userlist表并给每条记录加编号 将userdb库userlist表中UID ...

  2. [SQL基础教程] 4-3 数据的更新(UPDATE)

    [SQL基础教程] C4 数据更新 4-3 数据的更新(UPDATE) UPDATE UPDATE <表名> SET <列名> = <表达式>; UPDATE &l ...

  3. 【mybatis】mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wait timeout exceeded; try restarting transaction

    今天使用mybatis和jpa的过程中,发现这样一个问题: mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wai ...

  4. 在论坛中出现的比较难的sql问题:9(触发器专题 插入数据自动更新表数据)

    原文:在论坛中出现的比较难的sql问题:9(触发器专题 插入数据自动更新表数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所 ...

  5. SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据

    SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...

  6. SQL基础教程(第2版)第4章 数据更新:4-3 数据的更新(UPDATE)

    第4章 数据更新:4-3 数据的更新(UPDATE) ● 使用UPDATE语句可以更改(更新)表中的数据.● 更新部分数据行时可以使用WHERE来指定更新对象的条件.通过WHERE子句指定更新对象的U ...

  7. SQLite支持的SQL数据操作

    事务处理 Posted on 2013 年 1 月 1 日 by 林溪   事务为一组SQL命令的集合,这些SQL命令在执行时不可进行分割,即要么全部执行这些SQL命令,要么一个都不进行执行,事务操作 ...

  8. Kettle中通过触发器方式实现数据 增量更新

    在使用Kettle进行数据同步的时候, 共有 1.使用时间戳进行数据增量更新 2.使用数据库日志进行数据增量更新 3.使用触发器+快照表 进行数据增量更新 今天要介绍的是第3中方法. 实验的思路是这样 ...

  9. JAVA基础之sql模糊匹配、外键以及jsp中include的用法

    一.SQL模糊匹配 适用于对字符串进行模糊搜索 格式:   字段名 Like '%关键词%'      %          表示这个位置可有任意个字符(没有也可以) %关键词%  只要包含关键词就算 ...

随机推荐

  1. 【算法笔记】B1026 程序运行时间

    1026 程序运行时间 (15 分) 要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗 ...

  2. 在linux服务器上配置anaconda和Tensorflow,并运行

    1. 查看服务器上的Python安装路径: whereis python 2. 查看安装的Python版本号: python 3. 安装Anaconda: 1)下载 Anaconda2-4.0.0-L ...

  3. Tensorflow基础-mnist数据集

    MNIST数据集,每张图片包含28*28个像素,把一个数组展开成向量,长度为28*28=784,故数据集中mnist.train.images是一个形状为[60000,784]的张量,第一个维度数字用 ...

  4. VBS虚拟键盘十六进制列表

    Set WshShell=WScript.CreateObject("WScript.Shell") '打开我的电脑WshShell.Sendkeys chr(&h88b6 ...

  5. vue修改组件样式

    .el-date-editor /deep/ input{ padding-left:30px; } 改变引入的组件里面元素的样式: 1.去掉css内的scoped,但是这样会污染全局 2.加上/de ...

  6. [转] 使用 JavaScript 创建并下载文件

    [From] https://gaohaoyang.github.io/2016/11/22/js-create-file-and-download/ 本文将介绍如何使用 JavaScript 创建文 ...

  7. 使用electron构建跨平台Node.js桌面应用经验分享

    by zhangxinxu from http://www.zhangxinxu.com/wordpress/?p=6154 本文可全文转载,但需得到原作者书面许可,同时保留原作者和出处,摘要引流则随 ...

  8. sed 练习

    [root@server3 mnt]# cat -n passwd 1  root:x:0:0:root:/root:/bin/bash 2  bin:x:1:1:bin:/bin:/sbin/nol ...

  9. 采用MQTT协议实现android消息推送(3)选ActiveMQ当服务端

    官网: http://activemq.apache.org/ 1.简介 强壮.快速.客户端支持多种语言的mqtt服务端软件. 2.特性 MQTT v3.1.AMQP v1.0.Stomp .Open ...

  10. # 防止xss攻击,过滤script标签,获取出标签外的内容

    from bs4 import BeautifulSoups = '<h1>123</h1> <span>456<span>'soup = Beauti ...