如何在不获取重复列的情况下进行选择?

时间:2015-03-12 21:47:37

标签: sql

假设我在表A中有200列,表B中有200列,表C中有200列,表D中有200列,表E中有200列,表F中有200列,表G中有200列< / p>

现在说这些列中有190个在每个表中都有相同的名称,但其他10个表对于每个表都不同。

如何创建一个包含250列的新表(190表示所有表共有的表+表A中的10列其他列+表B中的其他10列以及其他10列中的列表C等)?

我试图这样做:

select Top 1 * into Master_Table 
from vw_A
cross join vw_B
cross join vw_C
cross join vw_D
cross join vw_E
cross join vw_F
cross join vw_G

但是我收到了这个错误:

Column names in each table must be unique. Column name 'CustomerVehicleID'     in table 'Master_Table' is specified more than once.

2 个答案:

答案 0 :(得分:0)

您需要Dynamic sqlinformation_schema.column才能获得不同的列列表。像这样的东西。

DECLARE @cols VARCHAR(max)='',
        @sql  NVARCHAR(max)

SELECT @cols += column_name + ','
FROM   (SELECT Row_number()OVER(partition BY column_name ORDER BY (SELECT NULL))    rn,
               TABLE_NAME+'.'+COLUMN_NAME  AS Column_name
        FROM   INFORMATION_SCHEMA.COLUMNS
        WHERE  TABLE_NAME IN ( 'vw_A', 'vw_B', 'vw_C', 'vw_D',
                               'vw_E', 'vw_F', 'vw_G' )) a
where rn=1

SELECT @cols = LEFT(@cols, Len(@cols) - 1)

SET @sql ='select Top 1 ' + @cols + ' into Master_Table 
            from vw_A
            cross join vw_B
            cross join vw_C
            cross join vw_D
            cross join vw_E
            cross join vw_F
            cross join vw_G' 

exec sp_executesql @sql 

答案 1 :(得分:0)

您可以在SELECT子句中包含一个表(vw_A.*)的所有列,而在其他表中只包含未出现在vw_A定义中的列:< / p>

select Top 1 vw_A.*,
    # columns of vw_B that do not exist in vw_A
    colB1, colB2, colB3, colB4,
    # columns of vw_C that do not exist in vw_A
    colC1, colC2, colC3, colC4,
    # columns of vw_D that do not exist in vw_A
    colD1, colD2, colD3, colD4,
    #
    # and so on
    #
into Master_Table 
from vw_A
cross join vw_B
cross join vw_C
cross join vw_D
cross join vw_E
cross join vw_F
cross join vw_G