Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 update语句出现问题_Sql_Sql Server - Fatal编程技术网

使用子查询时sql update语句出现问题

使用子查询时sql update语句出现问题,sql,sql-server,Sql,Sql Server,我有三张桌子:价格,产品价格,可变价格。 (我无法更改数据库中的数据建模) 问题是,我有时需要根据价格表更新价格表。我可以通过价格产品表和日期字段(有效日期和日期)链接这些表,这两个字段都存在。我可以根据PriceID链接PRICE和PRICE\u产品。以及基于ProductID、CompanyID、DeliveryID的产品价格和可变价格。表可变价格和价格我只能通过有效的日期和日期链接 CREATE TABLE [dbo].[PRICE]( [PriceId] [int] NOT N

我有三张桌子:价格,产品价格,可变价格。 (我无法更改数据库中的数据建模)

问题是,我有时需要根据价格表更新价格表。我可以通过价格产品表和日期字段(有效日期和日期)链接这些表,这两个字段都存在。我可以根据PriceID链接PRICE和PRICE\u产品。以及基于ProductID、CompanyID、DeliveryID的产品价格和可变价格。表可变价格和价格我只能通过有效的日期和日期链接

 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)
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
但我得到了一个错误:

无法找到多部分标识符“CHANGABLE_Prices.ProductID” 束缚

不知道如何处理这个问题

有什么想法吗?有人吗


提前感谢。

您试图更新的
可变价格表引用不在子查询的范围内。您需要在不使用子查询的情况下重写
更新
,如下所示:

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)
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

你大概打算:

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
                       );
也就是说,您需要相关条件来将子查询连接到外部查询

您最好使用explain
JOIN
s。然而,这两种方法有着微妙的不同:

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

CHANGABLE\u PRICES cp
您设置的别名
cp
,使用CHANGABLE\u PRICES.ProductID->cp。ProductID@TapakahUa。它不起作用了…谢谢你帮我解决了这个问题,但它不起作用了。。Msg 4104,级别16,状态1,第58行无法绑定多部分标识符“CHANGABLE_Prices.ProductID”。Msg 4104,级别16,状态1,第59行无法绑定多部分标识符“CHANGABLE_Prices.CompanyID…”。。。