选择表中除一列之外的所有列?

Select all the columns of a table except one column?

提问人:Giri Prasad 提问时间:3/17/2015 最后编辑:Dale KGiri Prasad 更新时间:11/1/2023 访问量:353952

问:

如何选择表格中除一列以外的所有列?

我有将近 259 列,我不能在声明中提及所有 258 列。SELECT

还有其他方法可以做到吗?

sql-server

评论

5赞 Rahul Tripathi 3/17/2015
您使用的是哪个 DBMS?
14赞 Luaan 3/17/2015
您已经有一个包含 259 列的表。你为什么在乎少选一个?你已经做了一个数据库的怪物和一个结果集的怪物,一列不会有什么不同。
0赞 3/17/2015
不,那是不可能的。你必须列出每一列(或者编写一个函数来为你做这个)。但是,许多 SQL 客户端可以帮助您通过自动完成自动“生成”该列表。另外,您使用的是哪种 DBMS?Postgres?神谕?
1赞 Luaan 3/17/2015
@GiriPrasad 在 Management Studio 中,可以右键单击表,选择 -> -> 。这将生成一个包含所有列的选择,您可以删除您不想要的列。Script table asSelect toNew query window
9赞 Bridge 3/24/2015
SQL的可能重复项使用SELECT * [except columnA] FROM tableA排除列?

答:

79赞 Rahul Tripathi 3/17/2015 #1

您可以使用此方法从除一列之外的所有列中获取数据:-

  1. 将所有数据插入到临时表中
  2. 然后从临时表中删除不需要的列
  3. 从临时表中获取数据(这将不包含已删除列的数据)
  4. 删除临时表

像这样的东西:

SELECT * INTO #TemporaryTable FROM YourTableName

ALTER TABLE #TemporaryTable DROP COLUMN Columnwhichyouwanttoremove

SELECT * FROM #TemporaryTable 

DROP TABLE #TemporaryTable 

评论

1赞 3/17/2015
你怎么知道Giri使用的是哪个DBMS?
18赞 Rahul Tripathi 3/17/2015
@a_horse_with_no_name:- 我不知道这就是为什么我说这只是一种方法
7赞 TommCatt 3/18/2015
我必须承认,这是一个新颖的解决方案。但是,每次需要执行查询时,这都会给繁忙的服务器带来相当大的负担。而这一切都是因为一个数据库开发人员对懒惰的攻击。“我不能在 select 语句中提及 258 列”确实如此!
16赞 TommCatt 3/18/2015
事实上,再想一想,我想我会和任何执行此类代码的程序员坐下来聊很久。当然,我还想与设计这样一张表的人进行长时间的讨论,然后再次与请求这种查询的分析师进行长时间的讨论。人头会滚!
2赞 Erwan Daniel 10/7/2020
它怎么可能是一个公认的答案?我正在等着看一个人问为什么这个查询这么长,有数十亿行的表......@TommCatt,我会坐在你旁边。
7赞 Sagar Joon 3/17/2015 #2

有很多选项可用,其中之一是:

 CREATE TEMPORARY TABLE temp_tb SELECT * FROM orig_tb;
 ALTER TABLE temp_tb DROP col_x;
 SELECT * FROM temp_tb;

这里的col_x是您不想包含在 select 语句中的列。

看看这个问题:选择MySQL中除一列之外的所有列?

22赞 TommCatt 3/18/2015 #3

创建视图。是的,在视图创建语句中,您必须列出每个...和。。。每。。。田。。。由。。。名字。

一次。

然后就在那之后。select * from viewname

评论

0赞 João Pimentel Ferreira 7/4/2022
此视图在连接结束后会持续吗?
12赞 ps_prakash02 3/24/2015 #4

您可以从 sys.columns 表中获取列名详细信息

请尝试以下查询:

SELECT * FROM SYS.COLUMNS 
WHERE object_id = OBJECT_ID('dbo.TableName') 
AND [Name] <> 'ColumnName'

DECLARE @sql as VARCHAR(8000)
SET @sql = 'SELECT '

SELECT @sql += [Name] + ', ' FROM SYS.COLUMNS 
WHERE object_id = OBJECT_ID('dbo.TableName') 
AND [Name] <> 'ColumnName'

SELECT @sql += ' FROM Dbo.TableName'

EXEC(@sql)
4赞 Sergio Pisoni 1/1/2016 #5

无需创建新表,您可以简单地执行以下操作(例如使用 mysqli):

  1. 获取所有列
  2. 遍历所有列并删除所需的 wich
  3. 进行查询

$r = mysqli_query('SELECT column_name FROM information_schema.columns WHERE table_name = table_to_query');

$c = count($r); while($c--) if($r[$c]['column_name'] != 'column_to_remove_from_query') $a[] = $r[$c]['column_name']; else unset($r[$c]);

$r = mysqli_query('SELECT ' . implode(',', $a) . ' FROM table_to_query');
0赞 Abhinav Vanam 1/21/2017 #6

在本例中,请在对象资源管理器中展开该数据库的列。将列拖入查询区域。

然后只需删除一两列您不想要的列,然后运行它。我愿意接受任何比这更容易的建议。

1赞 Omid Nasri 9/8/2017 #7

请尝试以下查询:

DECLARE @Temp NVARCHAR(MAX); 
DECLARE @SQL NVARCHAR(MAX);

SET @Temp = '';
SELECT @Temp = @Temp + COLUMN_NAME + ', ' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='Person' AND COLUMN_NAME NOT IN ('Id')  

SET @SQL = 'SELECT ' + SUBSTRING(@Temp, 0, LEN(@Temp)) +' FROM [Person]';
EXECUTE SP_EXECUTESQL @SQL;
-1赞 yasir kk 4/26/2018 #8

只有一种方法可以实现此给定列名称。没有找到其他方法。您必须列出所有列名

评论

1赞 WestCoastProjects 12/21/2019
虽然你说的可能是一般的情况,但有多个答案描述了可以达到预期结果的[角落]情况。
19赞 Fatore 3/1/2019 #9

这不是一个通用的解决方案,但某些数据库允许您使用正则表达式来指定列。

例如,对于 Hive,以下查询选择除 ds 和 hr 之外的所有列:

SELECT `(ds|hr)?+.+` FROM sales

评论

2赞 WestCoastProjects 12/21/2019
我是一个认真的开发人员,对此一无所知 - v cool。hive
3赞 lovetl2002 6/28/2020
此正则表达式存在缺陷。如果要排除两列,则仍将匹配列。那是因为正则表达式引擎渴望.虽然更改顺序可以解决此问题,但更好的方法是使用负前瞻。dayday_hour(day|day_hour)?+.+day_hour|(day_hour|day)?+.+(?!(day|day_hour)$).+
1赞 Bowen Liu 9/15/2020
我正在使用 Hive,但不知何故它给了我一个错误,说 .似乎它正在阅读“(colname)?+.+”作为文字列名。有什么解决方案吗?谢谢。Invalid table alias or column reference
0赞 Danyal 7/11/2023
为此,应将 hive.support.quoted.identifiers 设置为 none。
0赞 Danyal 7/11/2023
@lovetl2002这是一个非常重要的问题!
10赞 Ashish Gupta 3/6/2019 #10

我只是想回应@Luann的评论,因为我总是使用这种方法。

只需右键单击“脚本”表>作为“选择以>新查询”窗口>即可。

您将看到 select 查询。只需取出要排除的列,即可获得首选的选择查询。enter image description here

评论

0赞 Johny Skovdal 1/29/2020
我最终也得到了简单的解决方案 - 更简单的是使用“选择前 1000 行”。:)
7赞 Vlad Bezden 6/21/2019 #11

如果您使用的是 DataGrip,则可以执行以下操作:

  1. 输入 SELECT 语句SELECT * FROM <your_table>;
  2. 将光标放在上面并按*Alt+Enter
  3. 您将获得带有选项的弹出菜单Expand column list
  4. 单击它,它将转换为完整的列列表*
  5. 现在,您可以删除不需要的列

这里有一个链接,提供了有关如何执行此操作的示例。

评论

0赞 Kevin Kreps 1/19/2022
这是一个很好的解决方案
8赞 Bikash Mahato 10/29/2020 #12

您可以通过简单查询检索列名列表,然后通过像这样应用where查询来删除这些列。

SELECT * FROM (
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'TableName'
) AS allColumns
WHERE allColumns.COLUMN_NAME NOT IN ('unwantedCol1', 'unwantedCol2')

评论

3赞 astentx 10/29/2020
它可以通过单个 where 子句来完成,无需从 select 中进行选择
0赞 Vaeryn 8/9/2023 #13

您可以选择数据到临时表,通过删除不需要的列来更改表,然后删除临时表。例如。我正在从 HumanResources.Employee 获取数据,使用该数据创建临时表,删除 LoginID 列,然后删除临时表:

SELECT *
INTO temp_table
FROM HumanResources.Employee

ALTER TABLE temp_table
DROP COLUMN LoginID
GO

SELECT *
FROM temp_table
DROP TABLE temp_table