select id=identity(int, 0, 1),
g=0,
a=CAST(N','+quotename([name])
    +'=SUM(CASE [name] WHEN '+quotename([name], N'''')
    +' THEN 1 END)' AS nvarchar(4000))
into # from syscolumns
where name>''
group by name
update a set g=id/i from # a,          --第一句
(select i=3800/max(len(a)) from #)b    --第二句drop table #如何正确理解第一句和第二句?
i是变量还是什么?

解决方案 »

  1.   

    update a set g=id/i 
    from # a, 
    (
    select i=3800/max(len(a)) 
    from #
    ) bi是子查询里的一个列的别名.不是变量
    记住,SQL里的变量是以@标识的。这是连表更新的一种用法。实质同于下面:
    UPDATE a SET a.Name=b.Name
    FROM tbA a
    INNER JOIN tbB b
    ON b.ID=a.ID
    意思是将tbA表中id与tbB表中id相同的记录的name字段替换成tbB表中的name字段值只不过你的这个语句中对比上面的 tbB 实际是个子查询而且你连表时没有WHERE 条件,不是INNER JOIN而已
    语句相当于
    UPDATE a SET a.Name=b.Name
    FROM tbA a,tbB b