我们都知道,要从表中选择所有列,可以使用

SELECT * FROM tableA

是否有一种方法可以在不指定所有列的情况下从表中排除列?

SELECT * [except columnA] FROM tableA

我所知道的唯一方法是手动指定所有列并排除不需要的列。这真的很耗时,所以我正在寻找方法来节省时间和精力,以及未来的维护表应该有更多/更少的列。


当前回答

你可以这样尝试:

/* Get the data into a temp table */
SELECT * INTO #TempTable
FROM YourTable
/* Drop the columns that are not needed */
ALTER TABLE #TempTable
DROP COLUMN ColumnToDrop
/* Get results and drop temp table */
SELECT * FROM #TempTable
DROP TABLE #TempTable

其他回答

是否有一种方法可以在不指定的情况下从表中排除列 所有的列?

以通常的方式使用声明性SQL是不行的。

我认为你提出的语法是有价值的,是好的。事实上,关系数据库语言‘Tutorial D’有一个非常相似的语法,关键字ALL BUT后面跟着一组属性(列)。

然而,SQL的SELECT *已经受到了很多批评(@Guffa的回答是一个典型的反对),所以我不认为SELECT ALL BUT会很快进入SQL标准。

我认为最好的“工作”是创建一个视图,只有你想要的列,然后选择*从那个视图。

这样做不是更简单吗:

sp_help <table_name>

点击“Column_name”列>复制>粘贴(创建一个垂直列表)到新建查询窗口,只需在每个列值前面键入逗号…注释掉你不想要的专栏。比这里提供的任何代码都要少得多,而且仍然是可管理的。

像BigQuery这样的现代SQL方言提出了一个极好的解决方案。

SELECT * EXCEPT(ColumnNameX, [ColumnNameY, ...])
FROM TableA

这是一种非常强大的SQL语法,可以避免由于表列名更改而需要随时更新一长串列。而这个功能在当前的SQL Server实现中是缺失的,这是一个遗憾。希望有一天,微软Azure对数据科学家更加友好。

数据科学家喜欢有一个快速选项来缩短查询并删除一些列(由于重复或任何其他原因)。

https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#select-modifiers

下面是生成在查询中使用的列的列表(不是自动查询,因为这没有指定):

SELECT 
    GROUP_CONCAT(
        CONCAT('`', `COLUMN_NAME`, '`')
        SEPARATOR ',\n'
    ) AS `cols`
FROM information_schema.`COLUMNS`
WHERE `TABLE_SCHEMA` = 'db'
AND `TABLE_NAME` = 'table_name_here'
AND `COLUMN_NAME` NOT IN ('exclude_col1', 'exclude_col2')

会产生:

`included_col1`,
`included_col2`,
`included_col3`

然后你可以复制这个在查询中使用:

SELECT
    `included_col1`,
    `included_col2`,
    `included_col3`
FROM db.table_name_here

如果您有许多列,而您只想排除其中一列。您可以使用下面的命令 从表中选择* exclude(列名)