此更新过程的sql语法是否正确
我有三张桌子: 带有LandingId、ProductId和单价字段的LandingDetails 带有LandingId和LandingDate字段的LandingHeader 带有ProductId和CostPrice字段的产品 我希望根据两个日期之间的LandingHeader中的landingdate,从产品中的costprice计算LandingDetails单价 在第一次尝试时,我提出了以下内容,这可能与目标的概念相符,但显然没有实现表连接此更新过程的sql语法是否正确,sql,sql-server-2014-express,Sql,Sql Server 2014 Express,我有三张桌子: 带有LandingId、ProductId和单价字段的LandingDetails 带有LandingId和LandingDate字段的LandingHeader 带有ProductId和CostPrice字段的产品 我希望根据两个日期之间的LandingHeader中的landingdate,从产品中的costprice计算LandingDetails单价 在第一次尝试时,我提出了以下内容,这可能与目标的概念相符,但显然没有实现表连接 CREATE PROCEDURE
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
有人能指出我怀疑的是我的一个愚蠢的语法错误吗?您在第二个SP中的查询应该如下所示:
UPDATE
dbo.LandingDetails
SET
UnitPrice=p.CostPrice
FROM
dbo.LandingDetails ld
INNER JOIN dbo.LandingHeaders lh ON
lh.LandingId=ld.LandingId
INNER JOIN dbo.Products P ON
P.ProductId=ld.ProductId
WHERE
lh.LandingDate BETWEEN @StartDate AND @EndDate
您在第二个SP中的查询应如下所示:
UPDATE
dbo.LandingDetails
SET
UnitPrice=p.CostPrice
FROM
dbo.LandingDetails ld
INNER JOIN dbo.LandingHeaders lh ON
lh.LandingId=ld.LandingId
INNER JOIN dbo.Products P ON
P.ProductId=ld.ProductId
WHERE
lh.LandingDate BETWEEN @StartDate AND @EndDate
我建议你使用合并语句,它更容易阅读,并且有更好的效果performances@sagi实际上,MERGE并没有那么好的性能。通常情况下,它比update@EvaldasBuinauskasI中的sub-select更好。我建议您使用MERGE语句,它更易于阅读,并且具有更好的性能performances@sagi事实上,MERGE并没有那么棒性能。通常比更新@EvaldasBuinauskas中的子选择更好