在引用表2和表3时,从表2向表1插入数据

时间:2015-01-12 21:43:57

标签: sql sql-server join

我正在构建一个SQL脚本,它将有助于自动创建新的AD帐户。

我有3个与我的问题相关的表格 - CurrentAD,ADChanges和Worker。

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个表连接到第3个表,这不是我需要做的。

任何帮助将不胜感激!我正在使用Microsoft SQL Server 2012。

1 个答案:

答案 0 :(得分: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)