【问题标题】:SQL Select Column From Table Based on Another Select StatementSQL 根据另一个 Select 语句从表中选择列
【发布时间】:2013-12-29 21:43:54
【问题描述】:

我有一个表,其中包含另一个表中的列名。我想运行一个更新语句来更新该表中的一些值,基于另一个。

前:

TableA 
ID|Column1|Column2
1 |  1.3  |  2.3
2 |  0    |   7
3 |  2.5  |  12.1

TableB
ID|ColumnName|MaxValue
1 | Column1  | NULL
2 | Column2  | NULL

类似这样的事情:

所以在这种情况下,我想将 TableB 中的 MaxValue 更新为 TableA 中的最大值,其中 ColumnName 是 TableA 中的一个列。

这可能吗?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您可以使用游标和一些动态 sql 来完成。这不是最好的做法,但如果你需要一个快速而肮脏的解决方案,你可以去:

     DECLARE @colName VARCHAR(50), @str VARCHAR(2000), @id int
     DECLARE c CURSOR FOR       
        SELECT id, columnName
        FROM tableB
    OPEN c
    FETCH NEXT FROM c INTO @id, @columnName
    WHILE @@fetch_status = 0 
    BEGIN
        SET @str = 'update tableB set MaxValue = ( select max(' + @colName + ') from 
                        tableA ) where id = ' + CONVERT(VARCHAR, @id)
        EXEC ( @str ) 
    FETCH NEXT FROM c INTO @id, @columnName
    END
    CLOSE c
    DEALLOCATE c
    

    【讨论】:

      【解决方案2】:

      如果你不想使用动态 SQL,你总是可以这样做

      Update TableB
      Set MaxValue = MaxValues.MaxValue
      From TableB
          Join 
          (
           Select MaxValue = Max(Column1)
               ,ColumnName = 'Column1'
           From TableA
      
           Union All 
      
           Select MaxValue = Max(Column2)
               ,ColumnName = 'Column2'
           From TableA
      
           -- Union All ... and so on for all columns
      
          ) MaxValues
          On TableB.ColumnName = MaxValues.ColumnName
      

      请记住,如果 TableA DDL 发生更改,您必须更新此 DML。

      【讨论】:

        猜你喜欢
        • 2017-10-14
        • 2015-05-17
        • 2012-01-30
        • 1970-01-01
        • 1970-01-01
        • 2015-09-20
        • 1970-01-01
        • 1970-01-01
        • 2019-06-03
        相关资源
        最近更新 更多