2013-12-11 3 views
0

У меня есть таблица, содержащая имена столбцов из другой таблицы. Я хочу запустить инструкцию обновления, чтобы обновить некоторые значения из этой таблицы, основываясь на другой.SQL Select Column From Table на основе другого оператора Select

EX:

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 

Что-то вдоль линий этого:

Таким образом, в этом случае, я хотел бы обновить MaxValue в TableB быть максимальное значение из TableA где ColumnName является Колум в таблице А.

Возможно ли это?

ответ

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 
1

Если вы не хотите использовать динамический 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.

Смежные вопросы