使用子查询时sql update语句出现问题
我有三张桌子:价格,产品价格,可变价格。 (我无法更改数据库中的数据建模) 问题是,我有时需要根据价格表更新价格表。我可以通过价格产品表和日期字段(有效日期和日期)链接这些表,这两个字段都存在。我可以根据PriceID链接PRICE和PRICE\u产品。以及基于ProductID、CompanyID、DeliveryID的产品价格和可变价格。表可变价格和价格我只能通过有效的日期和日期链接使用子查询时sql update语句出现问题,sql,sql-server,Sql,Sql Server,我有三张桌子:价格,产品价格,可变价格。 (我无法更改数据库中的数据建模) 问题是,我有时需要根据价格表更新价格表。我可以通过价格产品表和日期字段(有效日期和日期)链接这些表,这两个字段都存在。我可以根据PriceID链接PRICE和PRICE\u产品。以及基于ProductID、CompanyID、DeliveryID的产品价格和可变价格。表可变价格和价格我只能通过有效的日期和日期链接 CREATE TABLE [dbo].[PRICE]( [PriceId] [int] NOT N
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
);
也就是说,您需要相关条件来将子查询连接到外部查询
您最好使用explainJOIN
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…”。。。