2013-12-11 208 views
0

我有一個表包含另一個表中的列名。我想運行一個更新語句來從該表中更新一些值,基於另一個值。SQL根據另一個選擇語句從表中選擇列

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 

沿着這個東西線:

因此,在這種情況下,我想TableB中更新的MaxValue從TableA的最高值,其中的ColumnName是科拉姆在表A中。

這可能嗎?

回答

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。