我使用以下查询来更新我的表格数据
Update BudCustomers
set BudCustomers.ImportedRecord = ImportedRecord
,BudCustomers.VersionID = @VersionId
,BudCustomers.STATUSID = @StatusId
,BudCustomers.MajorCode = EBIC.MajorCode
FROM BudCustomers BCUST
JOIN External_Blk_Itm_Contracts EBIC ON BCUST.LegalName = EBIC.CustomerName
Where BCUST.ImportedRecord <> @ImportedRecord
OR BCUST.STATUSID <> @StatusId
OR BCUST.MajorCode <> EBIC.MajorCode
但由于性能问题,我不想使用where子句而是我想做那些在连接本身的子句事情但我怀疑我是否正确。请为下面的查询提供以下建议。那会是一样的吗?我担心AND和OR条件的连接是否会起作用
Update BudCustomers
set BudCustomers.ImportedRecord = ImportedRecord
,BudCustomers.VersionID = @VersionId
,BudCustomers.STATUSID = @StatusId
,BudCustomers.MajorCode = EBIC.MajorCode
FROM BudCustomers BCUST
JOIN External_Blk_Itm_Contracts EBIC ON BCUST.LegalName = EBIC.CustomerName AND BCUST.ImportedRecord <> @ImportedRecord OR BCUST.STATUSID <> @StatusId OR BCUST.MajorCode <> EBIC.MajorCode
答案 0 :(得分:1)
不,你的第二个查询不会给出与第一个相同的答案。将其重写为仅限连接的方法是
...
JOIN External_Blk_Itm_Contracts EBIC
ON BCUST.LegalName = EBIC.CustomerName
AND (BCUST.ImportedRecord <> @ImportedRecord
OR BCUST.STATUSID <> @StatusId
OR BCUST.MajorCode <> EBIC.MajorCode)
或者您可以将其重写为仅限WHERE。在任何现代SQL服务器(包括SQL Server)上,所有三个备选方案都应针对同一查询计划进行优化,因此您的第一次尝试可能最容易理解。
如果您遇到性能问题,我会查看您的索引是否适合等值连接,以及连接是否正确...您是否真的使用客户的“合法名称”?作为主键,而不是一些分配或外部标识符?如果客户更改了他的名字怎么办?如果两个独立的客户碰巧具有完全相同的名称会怎样?