萌新的成長之路!
最近遇到的一個需求是需要將兩張關聯的表的數據進行匹配(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語句)。反思自己之前真的是沒認真在對待,以后一定要改正,對於細節也更要注意!
萌新的這個坑已經填完了,寫博客就像寫日記一樣,不光是為了記錄自己學到的東西,也為了能夠讓自己更清楚哪些地方不足,以后多注意,也互相共勉!
