如何更新SQL SERVER

时间:2015-08-13 10:40:31

标签: sql sql-server tsql pivot

我有平台,我必须使用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与我的主表匹配。

我为可怕的英语感到抱歉,但我希望有人可以帮助我。

3 个答案:

答案 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