如何使用SQL更新虚拟表?

时间:2012-10-04 07:58:44

标签: sql sql-server tsql

我有这个sql语句:

    SELECT 
     t0.col0,
     t0.col1,
     t2.col0,
     t2.col1,
     t1.col0,
     t1.col1,
     t3.col3,
     t3.col5,
     t1.col2
    FROM table0 t0
    INNER JOIN table1 t1 ON t0.col0 = t1.col1
    INNER JOIN table2 t2 ON t2.col0 = t1.col0
    INNER JOIN table3 t3 ON t1.col0 = t3.col1
    WHERE t1.col1 in (300, 301, 302, 302)
    AND t2.col5 like 'V-%'
    AND t3.delete = 'false'

这完美地运行并显示带有连接列的虚拟表。所以我试着像这样直接更新这个表:

UPDATE T SET  T.col1 = 1, T.col2 = '01.01.2012'
FROM (
    SELECT 
     t0.col0,
     t0.col1,
     t2.col0,
     t2.col1,
     t1.col0,
     t1.col1,
     t3.col3,
     t3.col5,
     t1.col2
    FROM table0 t0
    INNER JOIN table1 t1 ON t0.col0 = t1.col1
    INNER JOIN table2 t2 ON t2.col0 = t1.col0
    INNER JOIN table3 t3 ON t1.col0 = t3.col1
    WHERE t1.col1 in (300, 301, 302, 302)
    AND t2.col5 like 'V-%'
    AND t3.delete = 'false'
) as T

没有成功......唯一的方法是创建一个View并继续更新它。

但我可以在一个语句中更新虚拟表吗?

1 个答案:

答案 0 :(得分:0)

您不是要更新表,而是更新select语句的输出。它不是虚拟表,因为输出无处可去。

我认为你需要这样的东西。

UPDATE T SET  t0.col0 = 1, t0.col1 = '01.01.2012'
    FROM table0 t0
    INNER JOIN table1 t1 ON t0.col0 = t1.col1
    INNER JOIN table2 t2 ON t2.col0 = t1.col0
    INNER JOIN table3 t3 ON t1.col0 = t3.col1
    WHERE t1.col1 in (300, 301, 302, 302)
    AND t2.col5 like 'V-%'
    AND t3.delete = 'false'