我有平台,我必须使用EAN属性与我的主表连接并更新gid(我的主表的id)。
id attrib value gid 1 weight 10 NULL 1 ean 123123123112 NULL 1 color blue NULL 2 weight 5 NULL 2 ean 331231313123 NULL
我试图将ean行旋转到列中,然后在两个表上连接,并且在这一刻,一切都很好。
--update SideTable
--set gid = ab_id
select gid, ab_id
from SideTable
pivot (max (value) for attrib in ([EAN],[MPN])) as b
join MainTable as c
on c.ab_ean = b.EAN
where b.EAN !='' AND c.ab_archive = '0'
当我选择两个id列时都是okey,但是当我取消注释第一行并删除时,选择整个表是使用我主表中的第一个gid设置的。
必须将我的主要ID设置为所有属性,其中ID与我的主表匹配。
我为可怕的英语感到抱歉,但我希望有人可以帮助我。
答案 0 :(得分:2)
您的更新不起作用的原因是您在更新源和目标之间没有任何链接,尽管您在sidetable
子句中引用FROM
,这是有效的被PIVOT
函数销毁,不会将链接返回给您正在更新的SideTable
实例。由于没有链接,所有行都使用相同的值进行更新,这将是FROM
中遇到的最后一个值。
这可以通过运行以下内容来证明:
DECLARE @S TABLE (ID INT, Attrib VARCHAR(50), Value VARCHAR(50), gid INT);
INSERT @S
VALUES
(1, 'weight', '10', NULL), (1, 'ean', '123123123112', NULL), (1, 'color', 'blue', NULL),
(2, 'weight', '5', NULL), (2, 'ean', '331231313123', NULL);
SELECT s.*
FROM @S AS s
PIVOT (MAX(Value) FOR attrib IN ([EAN],[MPN])) AS pvt;
您在s
子句中明显有一个别名为FROM
的表格,但由于您使用了数据透视表而无法使用SELECT s*
,因此会出现以下错误:
列前缀'与查询中使用的表名或别名不匹配。
您尚未提供主表的示例数据,但我大约95%确定您的PIVOT不需要,我认为您可以使用正常JOIN
s来获取更新:
UPDATE s
SET gid = ab_id
FROM SideTable AS s
INNER JOIN SideTable AS ean
ON ean.ID = s.ID
AND ean.attrib = 'ean'
INNER JOIN MainTable AS m
ON m.ab_EAN = ean.Value
WHERE m.ab_archive = '0'
AND m.ab_EAN != '';
答案 1 :(得分:0)
试着把它分解得更像......
update SideTable
set SideTable.gid = p.ab_id
FROM
(
select gid, ab_id
from SideTable
pivot (max (value) for attrib in ([EAN],[MPN])) as b
join MainTable as c
on c.ab_ean = b.EAN
where b.EAN !='' AND c.ab_archive = '0'
) p
WHERE p.EAN = SideTable.EAN
答案 2 :(得分:0)
根据对该问题的评论,您需要使用update
+ select
声明。
标准版本如下:
UPDATE
T
SET
T.col1 = OT.col1,
T.col2 = OT.col2
FROM
Some_Table T
INNER JOIN
Other_Table OT
ON
T.id = OT.id
WHERE
T.col3 = 'cool'
关于您的需求:
update a
set a.gid = p.ab_id
from SideTable As a
Inner join (
select gid, ab_id
from SideTable
pivot (max (value) for attrib in ([EAN],[MPN])) as b
join MainTable as c
on c.ab_ean = b.EAN
where b.EAN !='' AND c.ab_archive = '0') p ON a.ean = p.EAN