萌新的成长之路!

  最近遇到的一个需求是需要将两张关联的表的数据进行匹配(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语句)。反思自己之前真的是没认真在对待,以后一定要改正,对于细节也更要注意!

    萌新的这个坑已经填完了,写博客就像写日记一样,不光是为了记录自己学到的东西,也为了能够让自己更清楚哪些地方不足,以后多注意,也互相共勉!

最新文章

  1. java代码的初始化过程研究
  2. Qt应用程序图标设置
  3. 机器学习实战(一)kNN
  4. win10使用小技巧以及常见问题处理方案
  5. js兼容方法:获取当前样式|计算后样式 getStyle
  6. HTTP 错误 500.21 - Internal Server Error 处理程序“PageHandlerFactory-Integr
  7. Spring IOC之基于注解的容器配置
  8. ArrayList的sublist注意
  9. iptables使用实践
  10. Python基础篇(五)
  11. jS弹出新窗口被拦截的解决方法
  12. MFC如何添加背景图片
  13. ubuntu下VS code如何调试C++代码
  14. [术语] CRUD 增删改查
  15. java JDBC编程流程步骤
  16. eclipse:报错信息The superclass &quot;javax.servlet.http.HttpServlet&quot; was not found on the Java Build Path
  17. 三星S4 i9508 4.4.2 root 教程
  18. Nginx端口占用问题
  19. (转)Android分布式编译学习(一)distcc实现分布式编译 —— Ubuntu12.04上部署distcc分布式编译
  20. 用tornado实现一个简单的websocket样例

热门文章

  1. POJ_3414 Pots 【复杂BFS】
  2. 【数学】【筛素数】Miller-Rabin素性测试 学习笔记
  3. java 并发完成任务之CountDownLatch
  4. 利用touchslide实现tab滑动切换
  5. hdu1837 看病要排队(优先队列)
  6. 【实战】Oracle注入总结
  7. bugzilla配置邮箱发送邮件问题
  8. PIE SDK栅格生成等值线、面
  9. Spark遇到的报错和坑
  10. Linux mmap 要主动释放共享内存