0 sql-server-2005 sql-server t-sql update
我一直在做一些关于SELECT
从这个更新中删除关键字的测试:
Update #tmpDriverTime
Set WorkDay2 = (Select IsNull(Sum(PyblHrs),0)
From spr_DriverTimeEntry
Where spr_DriverTimeEntry.DrvrID = #tmpDriverTime.EmployeeNo
And Convert(Varchar(12),dtwrkd,112) = Convert(Varchar(12),@StartDate_1,112))
Run Code Online (Sandbox Code Playgroud)
从我所做的测试来看,无论是否有SELECT
关键字,都返回了相同的数据。我由我们的 DBA 运行代码以获得他删除SELECT
语句的批准,他说我不能,因为删除SELECT
语句会导致更新以不同的方式工作,但他无法阐明它的工作方式有何不同。我已经对新的进行了一些搜索,并找到了一些 MSDN 页面,他们在其中运行UPDATE FROM
没有SELECT
关键字的命令。所以现在我很困惑,我在 MSDN 上找到的测试和其他示例说我可以删除SELECT
关键字,但我的 DBA 说不。删除SELECT
关键字是否会影响UPDATE FROM
工作方式,如果会,它会如何影响它?
就我个人而言,我会用以下方式重写它,以清楚地分离源和目标,而不是使用这种子查询分配技术。当然,我正在假设其中一些列的来源,因为您没有使用别名,因此引用不明确。
DECLARE @sd DATETIME;
SET @sd = DATEADD(DAY, DATEDIFF(DAY, 0, @StartDate_1), 0);
;WITH hrs(DrvrID, ph) AS
(
SELECT EmployeeNo, SUM(PyblHrs)
FROM #tmpDriverTime
GROUP BY EmployeeNo
)
UPDATE e
-- "WorkDay2" represents a sum of payable hours? Quaint.
SET WorkDay2 = COALESCE(hrs.ph, 0)
FROM hrs
INNER JOIN dbo.spr_DriverTimeEntry AS e -- schema prefix always, please
ON hrs.DrvrID = e.DrvrID
-- please don't convert both sides to a string
-- use a range, then you can still use an index:
WHERE e.dtwrkd >= @sd
AND e.dtwrkd < DATEADD(DAY, 1, @sd);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1116 次 |
最近记录: |