如何使用SQL从一个表(如果不是另一个表)中删除列?

时间:2019-04-22 16:15:49

标签: sql

我们说

表1具有列:列1列2列3

表2具有列:列2列3列4

我希望删除Column1,因为它不在Table2中。

我猜测我需要加入,然后从中删除。我做了一些搜索,发现了这篇文章: How can I get column names from a table in SQL Server?

我尝试过:

    SELECT   T.TABLE_NAME AS 'TABLE NAME',
             C.COLUMN_NAME AS 'COLUMN NAME'
    FROM     INFORMATION_SCHEMA.TABLES T
       INNER JOIN INFORMATION_SCHEMA.COLUMNS C ON
             T.TABLE_NAME=C.TABLE_NAME
    WHERE    T.TABLE_TYPE='BASE TABLE'
    AND      T.TABLE_NAME LIKE 'T'

但是我只能得到一个表的列名。我尝试修改它没有运气,当然我也需要删除它。即使我可以获得不匹配的列的列表也会有所帮助。我不是SQL专家,但据我所知。任何帮助,将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

在这种情况下,您需要动态查询,因为在运行select语句以获取列名时会构建drop语句。

declare @column varchar(max)
set @column = (select............)
-- Print @column -- Use this to check if the column name is what you want

declare @sql nvarchar(max)
set @sql = 'alter table Table1 drop column ' + @column
execute (@sql)

如果您有任何疑问,请告诉我。

答案 1 :(得分:1)

我做了一个简单的查询,检查两个表都包含哪些列名,然后计算每个名称的出现次数。然后,它会显示少于两次的列,即仅出现在两个表之一中的列。

select name from (
    select [object_id], name from sys.all_columns where [object_id] = (select [object_id] from sys.tables where name = 'Table1')
    UNION ALL
    select [object_id], name from sys.all_columns where [object_id] = (select [object_id] from sys.tables where name = 'Table2')
) o
group by o.name
having count([object_id]) < 2

您可以使用该表中的数据进行单独的“空列”查询。