使用子查询时,SQL更新语句出现问题

时间:2018-07-19 08:04:04

标签: sql sql-server

我有3张桌子:PRICE,PRICE_PRODUCT和CHANGEABLE_PRICES。 (我无法更改数据库中的数据建模)

问题是我有时需要根据PRICE表更新表CHANGEABLE_PRICES。我可以通过两个表中都存在的PRICE_PRODUCT表和日期字段(Valid_date和date)链接这些表。我可以根据PriceID链接PRICE和PRICE_PRODUCT。以及基于ProductID,CompanyID,DeliveryID的PRICE_PRODUCT和CHANGEABLE_PRICES。我只能通过有效日期和日期链接表CHANGEABLE_PRICES和PRICE。

 CREATE TABLE [dbo].[PRICE](
    [PriceId] [int] NOT NULL,
    [Valid_date] [datetime] NOT NULL,
    [Price_Value] [decimal](18, 0) NOT NULL
) ON [PRIMARY]
GO

INSERT INTO PRICE VALUES (21, '2018-05-31', 45)
INSERT INTO PRICE VALUES (22, '2018-05-06', 10)

CREATE TABLE [dbo].[PRICE_PRODUCT](
    [PriceID] [int] NOT NULL,
    [ProductID] [int] NOT NULL,
    [CompanyID] [nvarchar](50) NOT NULL,
    [DeliveryID] [nvarchar](50) NOT NULL
) ON [PRIMARY]
GO

INSERT INTO PRICE_PRODUCT VALUES (21, 1, 'A', '001')
INSERT INTO PRICE_PRODUCT VALUES (22, 1, 'A', '001')


CREATE TABLE [dbo].[CHANGEABLE_Prices](
    [ProductID] [int] NOT NULL,
    [CompanyID] [nvarchar](50) NOT NULL,
    [DeliveryID] [nvarchar](50) NOT NULL,
    [Date] [datetime] NOT NULL,
    [Price_Value] [decimal](18, 0) NOT NULL
) ON [PRIMARY]
GO

我试图做这样的事情:

update CHANGEABLE_Prices set Price_Value = (select p.Price_Value from Price p inner join PRICE_PRODUCT pp
on p.PriceId = pp.PriceId, CHANGEABLE_PRICES cp where cp.ProductID = CHANGABLE_Prices.ProductID
and cp.CompanyID = CHANGABLE_Prices.CompanyID 
and cp.DeliveryID = CHANGABLE_Prices.DeliveryID
and p.Valid_date = CHANGABLE_Prices.date)

但是我遇到了错误:

  

多部分标识符“ CHANGABLE_Prices.ProductID”不能为   绑定。

,不知道如何处理此问题。

有什么想法吗?有人吗?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

您要更新的CHANGEABLE_Prices表引用不在子查询的范围内。您需要重写UPDATE而不使用子查询,如下所示:

update cp set Price_Value = p.Price_Value
from Price p
    inner join PRICE_PRODUCT pp on p.PriceId = pp.PriceId
    INNER JOIN CHANGEABLE_PRICES cp ON p.Valid_date = cp.date
        and cp.CompanyID = pp.CompanyID
        and cp.DeliveryID = pp.DeliveryID
        and p.Valid_date = p.date

答案 1 :(得分:0)

大概是您打算的:

update CHANGEABLE_Prices
    set Price_Value = (select p.Price_Value
                       from Price p inner join 
                            PRICE_PRODUCT pp
                            on p.PriceId = pp.PriceId
                       where cp.ProductID = CHANGABLE_Prices.ProductID and
                             cp.CompanyID = CHANGABLE_Prices.CompanyID and
                             p.DeliveryID = CHANGABLE_Prices.DeliveryID and
                             p.Valid_date = CHANGABLE_Prices.date
                       );

也就是说,您需要相关条件才能将子查询连接到外部查询。

使用说明JOIN可能会更好。但是,两种方法略有不同:

  • 如果有多个匹配项,则将返回错误。我认为这是一项好处,可以帮助您避免错误。 JOIN版本将使用任意匹配值。
  • 如果没有匹配项,则分配NULL。那可能不是您真正想要的,但是您尝试的版本会建议您想要这种行为。