2015-01-12 72 views
0

我正在構建一個SQL腳本,該腳本將有助於創建新的AD帳戶的自動化。在引用表2和3時將數據插入表2中的表1

我有3個表涉及我的問題 - CurrentAD,ADChanges和工人。

CurrentAD表將包含所有AD帳戶的列表並且不會被清除,但是每次腳本運行時,worker和ADChanges表都會被清除並重新填充。

ADChanges表的目的是,如果我們在worker表中有一條記錄,例如,用戶名的姓氏不同,但給定的名稱和僱員ID與現有記錄匹配CurrentAD表中,該行從worker表插入到ADChanges表中,然後從worker表中刪除。

這是我第一次做任何SQL腳本但一切似乎除了這個代碼一個塊中工作:

INSERT INTO ADChanges (sn, givenName, employeeID) 
SELECT Worker.sn, Worker.givenName, Worker.employeeID 
FROM Worker, 
CurrentAD 
WHERE Worker.sn NOT LIKE CurrentAD.sn AND Worker.employeeID LIKE CurrentAD.employeeID 
OR Worker.givenName LIKE CurrentAD.givenName AND Worker.sn LIKE CurrentAD.sn AND Worker.ou LIKE   CurrentAD.ou 
OR Worker.givenName NOT LIKE CurrentAD.givenName AND Worker.employeeID LIKE CurrentAD.employeeID 
GO 

上面的代碼是什麼是應該能夠從區分變化新的條目,但它不這樣做 - 也不會給我一個錯誤。我相信這可能是因爲有3張桌子涉及,但再次,因爲這是我第一次不知道從哪裏開始。

到目前爲止,我在互聯網上發現的一切都告訴我如何將數據從2個表連接到第三個,這不是我需要做的。

任何幫助,將不勝感激!我正在使用Microsoft SQL Server 2012.

+0

你的意思是,你並不需要從2代表的「加入數據第三」?連接5個表可以邏輯表示爲((((表1連接表2)連接表3)連接表4)連接表5'。 –

+1

我建議你先用括號()明確地分組你的WHERE條件,這樣你的語句返回時就沒有歧義。 – Zach

+1

此外,爲了清晰起見,我強烈建議使用ANSI JOIN語法。 –

回答

0

我要做的第一件事是明確地將各種WHERE子句放在圓括號中,以確保您知道要搜索的內容。我確定有關於SQL在WHERE子句中優先級的文檔,但最佳實踐建議您將它們包含在括號中,以便您絕對確定。其次,如果你沒有進行通配符查找,請使用相等運算符而不是LIKE運算符。我認爲在這種情況下你最終會得到相同的查詢計劃,但這對於解密你的代碼會有很大幫助。

第三,這裏有很多OR子句,你試圖一次性評估,這可能會導致SQL得到一個錯誤的查詢計劃。你可能會更好地分解不同的案例(我認爲我在這裏看到三個,我可能是錯的)分開陳述。這將使讀取,調試和SQL優化變得更加清晰。

這些案件中的一個例子可能是這樣的(使用連接,而不是與過濾叉積)

insert into ADChanges (sn, GivenName, EmployeeID) 
select w.sn, w.givenName, w.employeeID 
from Worker w 
inner join CurrentAd c 
    on w.EmployeeID = c.EmployeeID 
     and (w.sn != c.sn or 
      w.GivenName != c.GivenName) 
+0

感謝您的建議Xedni - 我實現了您提供的示例代碼,似乎沒有工作。 我很抱歉在這裏對你一無所知,但我很想知道爲什麼我們會用join來執行這個功能呢? 我只想重申一下,如果我之前並不清楚,我想根據表2和表3中的數據不匹配的條件,將表2中的記錄移到表1中,如果這樣做是有意義的? – BrettFK

+0

如果沒有看到表格和一些示例數據的DDL有點困難,但是當您說「...表格2和表格3中的數據確實/不匹配」時,聽起來像您正在描述加入我。我沒有辦法將一個表與另一個表的內容進行比較,而沒有聯接。 我仍然會建議列出你想要發生的所有不同情況,然後爲每種情況編寫一個單獨的,簡化的和明確的插入。如果您想發佈表格defs和一些示例數據,我可以嘗試幫助您瞭解連接細節。 – Xedni

相關問題