【问题标题】:Updating the main table row using another table which have multiple rows in sql server使用在 sql server 中具有多行的另一个表更新主表行
【发布时间】:2019-03-12 18:35:27
【问题描述】:

我有 2 个具有公共列 ID 的表

Table A:
ID   value1    value2    value3
------------------------------------        
 1     0         0        0

Table B:
ID    value_type      value   
--------------------------------------          
1     value1          0.01  
2     value2          0.02
3     value3          0.03

我想使用表 b 的值更新表 A 的值,

Final Output :

ID   value1    value2    value3
-----------------------------------------
1     0.01       0.02      0.03

谁能告诉我如何编写查询并获取上述结果,非常感谢!我试过加入,支点。一切都没有结果。

【问题讨论】:

  • 如果Table A 有多个ID 值会怎样?
  • 在给定示例中,对于表 B 的所有记录,可能是 ID 列的值为 1。请确认。
  • 是的,表 A 和表 B 中有多个值,并且具有公共列 ID
  • 不是根据您发布的示例数据。在表 A 中,您只发布了一条记录,而表 B 中的每条记录在 ID 列中都有不同的值。请edit您的问题解决文本和示例数据之间的冲突。当您使用它时,您应该阅读 meta.dba.stackexchange 上名为 Help me write this query in SQL 的优秀帖子。并将样本数据转换为 DDL+DML 语句。

标签: sql sql-server tsql sql-server-2008 stored-procedures


【解决方案1】:

一种快速(但不可扩展)的解决方案是使用更新语句,通过条件聚合连接到派生表:

UPDATE T
SET value1 = v1,
    value2 = v2,
    value3 = v3
FROM TableA T
JOIN 
(
    SELECT 1 As ID
           MAX(CASE WHEN value_type = 'value1' THEN value END) As v1,
           MAX(CASE WHEN value_type = 'value2' THEN value END) As v2,
           MAX(CASE WHEN value_type = 'value3' THEN value END) As v3
    FROM TableB
) V
    ON T.ID = V.ID

【讨论】:

  • 表中没有固定的列号可以动态获取吗?
  • 请编辑您的问题以准确说明您的需求。此外,请确保示例数据与文本匹配。在你这样做之前,我写的任何东西都是猜测。
  • @Thebeginner 。 . .这回答了您提出的问题,具体是关于更新第一个表中的三列。如果您有其他问题,请将其作为问题提出。您应该知道表格没有动态列,因此请注意下一个问题的措辞方式。
【解决方案2】:

使用 pivot 我们可以做到这一点

因为我将数据存储到一个表中,然后我才进行更新

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.value_type)
            FROM #b c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT rn as id , '  + (@cols) + ' into dynamictable  from 
            (
                select *,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID ) AS RN
                from #b
           ) x
            pivot 
            (
                MAX(VALUEE)
                for VALUE_TYPE in (' + @cols + ')
            ) p 
          '


exec(@query)
UPDATE T
SET T.value1 = V.value1,
    T.value2 = V.value2,
    T.value3 = V.value3
FROM #a T
JOIN 
(SELECT   id ,MAX(VALUE1)VALUE1 , MAX(VALUE2)VALUE2, MAX(VALUE3)VALUE3 
FROM  dynamictable
GROUP BY id
) V
    ON T.ID = V.ID

【讨论】:

  • 表中没有固定的列号可以动态获取吗?
  • @Thebeginner 那么你必须使用动态枢轴
  • 你能帮帮我吗?
  • @Thebeginner 这即使是动态查询也是不可能的,因为我们最多可以旋转多个列,但问题是我们无法将所需的输出更新到 table1,因为表只有 3 列,所以我可以给出代码只到动态枢轴
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 2021-01-11
相关资源
最近更新 更多