如何更新 SQL 服务器中的 table
How to UPDATE pivoted table in SQL SERVER
我有公寓 table,我必须使用 EAN 属性将其加入我的主 table 并更新 gid(我的主 table 的 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 行转换为列,然后在 ean 上加入两个 tables,目前一切正常。
--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'
当我 select 两个 id 列都正常时,但是当我取消注释第一行并删除 select 时,整个 table 设置为我的主 [=] 中的第一个 gid 25=].
它必须将我的主 ID 设置到所有属性中,其中 ID 与我的主 ID 匹配 table。
我很抱歉我的英语很糟糕,但我希望有人能帮助我。
试着把它分解得更像这样..
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
根据对问题的评论,您需要使用 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
您的更新不起作用的原因是您在更新的源和目标之间没有任何 link,尽管您在 FROM
子句中引用了 sidetable
,这被 PIVOT
函数有效地破坏了,没有 link 返回到您正在更新的 SideTable
的实例。由于没有 link,所有行都更新为相同的值,这将是 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;
您显然在 FROM
子句中有一个 table 别名 s
,但是因为您使用了 pivot 而不能使用 SELECT s*
,您会收到以下错误:
The column prefix 's' does not match with a table name or alias name used in the query.
您没有为您的主要 table 提供示例数据,但我大约 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 != '';
我有公寓 table,我必须使用 EAN 属性将其加入我的主 table 并更新 gid(我的主 table 的 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 行转换为列,然后在 ean 上加入两个 tables,目前一切正常。
--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'
当我 select 两个 id 列都正常时,但是当我取消注释第一行并删除 select 时,整个 table 设置为我的主 [=] 中的第一个 gid 25=].
它必须将我的主 ID 设置到所有属性中,其中 ID 与我的主 ID 匹配 table。
我很抱歉我的英语很糟糕,但我希望有人能帮助我。
试着把它分解得更像这样..
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
根据对问题的评论,您需要使用 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
您的更新不起作用的原因是您在更新的源和目标之间没有任何 link,尽管您在 FROM
子句中引用了 sidetable
,这被 PIVOT
函数有效地破坏了,没有 link 返回到您正在更新的 SideTable
的实例。由于没有 link,所有行都更新为相同的值,这将是 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;
您显然在 FROM
子句中有一个 table 别名 s
,但是因为您使用了 pivot 而不能使用 SELECT s*
,您会收到以下错误:
The column prefix 's' does not match with a table name or alias name used in the query.
您没有为您的主要 table 提供示例数据,但我大约 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 != '';