Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
此更新过程的sql语法是否正确_Sql_Sql Server 2014 Express - Fatal编程技术网

此更新过程的sql语法是否正确

此更新过程的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

我有三张桌子:

带有LandingId、ProductId和单价字段的LandingDetails

带有LandingId和LandingDate字段的LandingHeader

带有ProductId和CostPrice字段的产品

我希望根据两个日期之间的LandingHeader中的landingdate,从产品中的costprice计算LandingDetails单价

在第一次尝试时,我提出了以下内容,这可能与目标的概念相符,但显然没有实现表连接

    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中的子选择更好