如何更新 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,我认为您可以使用普通 JOINs 获取更新:

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 != '';