如何从SELECT查询中排除列?

时间:2010-09-06 10:23:23

标签: sql

我在表格中有100列,我想列出除特定列之外的99列。

如何排除列名?

5 个答案:

答案 0 :(得分:7)

Tutorial D关系数据库查询语言允许使用ALL BUT根据要删除的属性表示投影,但SQL中没有这样的等效语法允许您执行此操作。您需要明确列出您想要的具体内容。

如果您通常需要同一组列,则可以使用View。

答案 1 :(得分:6)

SELECT column_1, column_2, column_3, 
     /* ...the list of columns 4-97, not shown in this example... */,
     column_98, column_99
   FROM table

没有更简单的方法(可能是设计):您需要专门列出要检索的每个列。

尽管写入很麻烦,但这实际上是一件好事:不鼓励在生产代码中使用SELECT *(出于性能和可维护性的原因) - 请参阅例如this question

答案 2 :(得分:2)

你做不到。

理论上,你可能在这里涉及动态sql - 一些过程将循环遍历表的所有列(例如,Oracle中的all_tabs_columns字典视图列出所有表的所有列),并形成{{ {1}},但我强烈反对你这样做。将为您节省几行代码,但难以维护。 :)

答案 3 :(得分:1)

试试这个。

DROP TABLE #MY_TEMP_TABLE

CREATE TABLE #MY_TEMP_TABLE
(
    Column_1        int             NULL,
    Column_2        varchar(10)     NULL,
    Column_3        datetime        NULL
)

INSERT INTO #MY_TEMP_TABLE(Column_1, Column_2, Column_3)
        SELECT  1, 'a', GETDATE()
UNION   SELECT  2, 'b', GETDATE()
UNION   SELECT  3, 'c', GETDATE()
UNION   SELECT  4, 'd', GETDATE()

DECLARE @dSQL nvarchar(1000)

SELECT  @dSQL = 'SELECT TOP 10 '

SELECT  @dSQL = @dSQL + LEFT(nst.ColumnList, LEN(nst.ColumnList)-1) --AS 'List'
FROM    (SELECT  so.id
        FROM    TEMPDB..SYSOBJECTS so
        WHERE   so.name LIKE '#MY_TEMP_TABLE%'
        AND     so.type = 'u') so
CROSS APPLY (SELECT sc.Name + ', '
            FROM    TEMPDB..SYSCOLUMNS sc
            WHERE   sc.id = so.id
            AND     sc.colid <> 3
            FOR XML PATH('')) nst
            (ColumnList)

SELECT  @dSQL = @dSQL + ' FROM #MY_TEMP_TABLE'

EXEC sp_executesql @dSQL

答案 4 :(得分:1)

更快的查询解决方案!用粗体显示您要删除的表名和列名。您可以添加要删除的字段。

DECLARE @query nvarchar(max)=(SELECT string_agg(COLUMN_NAME,',') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='YOURTABLENAME'

AND COLUMN_NAME NOT IN ('REMOVEDCOLOUMN',.........))

SET @query ='select '+@query+' FROM YOURTABLENAME' EXEC sp_executesql @query;