【发布时间】:2016-01-13 17:16:18
【问题描述】:
我有三张桌子:
具有 LandingId、ProductId 和 UnitPrice 字段的 LandingDetails
具有 LandingId 和 LandingDate 字段的 LandingHeaders
具有 ProductId 和 CostPrice 字段的产品
我希望根据landingHeaders 中的landingdate 落在两个日期之间,从Products 中的costprice 中计算LandingDetails UnitPrice。
在第一次尝试时,我想出了以下内容,这可能符合目标的概念,但显然错过了表连接。
CREATE PROCEDURE dbo.UpdateAndPriceLandings
@StartDate DATE,
@EndDate DATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
UPDATE LandingDetails
SET UnitPrice = (SELECT p.CostPrice FROM Products p WHERE p.ProductId = LandingDetails.ProductId AND
dbo.LandingHeaders.LandingId = LandingId AND dbo.LandingHeaders.LandingDate1 BETWEEN @StartDate AND @EndDate)
GO
版本二如下,但我怀疑连接不正确。
CREATE PROCEDURE dbo.UpdateAndPriceLandings
@StartDate DATE,
@EndDate DATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
UPDATE dbo.LandingDetails
SET UnitPrice = (SELECT p.CostPrice FROM dbo.LandingDetails ld INNER JOIN
dbo.LandingHeaders lh ON ld.LandingId = lh.LandingId INNER JOIN
dbo.Products P ON ld.ProductId = p.ProductId
WHERE
ld.LandingId = lh.LandingId AND lh.LandingDate BETWEEN @StartDate AND @EndDate)
GO
谁能指出我怀疑是我的一个愚蠢的语法错误?
【问题讨论】:
-
我建议你使用 MERGE 语句,它更容易阅读并且性能更好
-
@sagi 其实 MERGE 并没有那么出色的表现。
-
通常最好在更新@EvaldasBuinauskas 中进行子选择
标签: sql sql-server-2014-express