SQL исключает столбец, используя SELECT * [кроме columnA] FROM tableA? - PullRequest
626 голосов
/ 08 апреля 2009

Мы все знаем, что для выбора всех столбцов из таблицы мы можем использовать

SELECT * FROM tableA

Есть ли способ исключить столбцы из таблицы без указания всех столбцов?

SELECT * [except columnA] FROM tableA

Единственный известный мне способ - вручную указать все столбцы и исключить ненужные столбцы. Это действительно отнимает много времени, поэтому я ищу способы сэкономить время и усилия на этом, а также на будущем обслуживании, если в таблице будет больше / меньше столбцов.

спасибо!

Ответы [ 36 ]

397 голосов
/ 11 ноября 2009

Я согласен со всеми ... но если бы я собирался сделать что-то подобное, я мог бы сделать это так:

/* 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
275 голосов
/ 08 апреля 2009

номер

Рекомендуется указывать только необходимые столбцы.

Как минимум 2 причины:

  • Это делает ваш контракт между клиентом и базой данных стабильным. Те же данные, каждый раз
  • Производительность, покрытие индексов

Редактировать (июль 2011 г.):

Если вы перетащите из Object Explorer узел Columns для таблицы, он поместит список CSV-столбцов в окне запросов для вас, который достигнет одной из ваших целей

63 голосов
/ 14 июля 2011

Автоматический способ сделать это в SQL (SQL Server):

declare @cols varchar(max), @query varchar(max);
SELECT  @cols = STUFF
    (
        ( 
            SELECT DISTINCT '], [' + name
            FROM sys.columns
            where object_id = (
                select top 1 object_id from sys.objects
                where name = 'MyTable'
            )
            and name not in ('ColumnIDontWant1', 'ColumnIDontWant2')
            FOR XML PATH('')
        ), 1, 2, ''
    ) + ']';

SELECT @query = 'select ' + @cols + ' from MyTable';  
EXEC (@query);
58 голосов
/ 13 июля 2012

Если вы не хотите писать каждое имя столбца вручную, вы можете использовать Script Table As, щелкнув правой кнопкой мыши по таблица или просмотр в SSMS , как это :

enter image description here

Затем вы получите полный запрос на выборку в Новое окно редактора запросов , а затем удалите ненужный столбец, например:

enter image description here

Выполнено

35 голосов
/ 08 апреля 2009

Вы можете создать представление, содержащее столбцы, которые хотите выбрать, затем вы можете просто выбрать * из представления ...

23 голосов
/ 13 апреля 2010

Да, это возможно (но не рекомендуется).

CREATE TABLE contact (contactid int, name varchar(100), dob datetime)
INSERT INTO contact SELECT 1, 'Joe', '1974-01-01'

DECLARE @columns varchar(8000)

SELECT @columns = ISNULL(@columns + ', ','') + QUOTENAME(column_name)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'contact' AND COLUMN_NAME <> 'dob'
ORDER BY ORDINAL_POSITION

EXEC ('SELECT ' + @columns + ' FROM contact')

Пояснение к коду :

  1. Объявить переменную для хранения списка имен столбцов через запятую. По умолчанию NULL.
  2. Используйте системное представление для определения имен столбцов в нашей таблице.
  3. Используйте SELECT @variable = @variable + ... FROM для объединения имена столбцов. Этот тип SELECT не возвращает набор результатов. Это, возможно, недокументированное поведение, но работает в каждой версии SQL Server. В качестве альтернативы вы можете использовать SET @variable = (SELECT ... FOR XML PATH('')) для объединения строк.
  4. Используйте функцию ISNULL для добавления запятой, только если это не имя первого столбца. Используйте функцию QUOTENAME для поддержки пробелов и знаков препинания в именах столбцов.
  5. Используйте предложение WHERE, чтобы скрыть столбцы, которые мы не хотим видеть.
  6. Используйте EXEC (@variable), также известный как динамический SQL , для разрешения имена столбцов во время выполнения. Это необходимо, потому что мы не знаем имен столбцов во время компиляции.
17 голосов
/ 08 апреля 2009

Как и другие говорили, что нет способа сделать это, но если вы используете Sql Server, хитрость, которую я использую, состоит в том, чтобы изменить вывод на разделенные запятыми, тогда выполните

select top 1 * from table

и вырезать весь список столбцов из окна вывода. Затем вы можете выбрать, какие столбцы вы хотите, не вводя их все.

11 голосов
/ 08 апреля 2009

По сути, вы не можете делать то, что хотели бы, но вы можете получить правильные инструменты, которые помогут вам сделать вещи немного проще.

Если вы посмотрите на SQL-подсказку Red-Gate , вы можете набрать «SELECT * FROM MyTable», а затем переместить курсор назад после «*» и нажать , чтобы развернуть список. полей и удалите те несколько полей, которые вам не нужны.

Это не идеальное решение, но чертовски хорошее! :-) Жаль, что Intellisense в MS SQL Server Management Studio все еще недостаточно интеллектуален, чтобы предлагать эту функцию .......

Марк

7 голосов
/ 30 августа 2011

Если вы используете SQL Server Management Studio, выполните следующие действия:

  1. Введите желаемое имя таблицы и выберите его
  2. Нажмите Alt + F1
  3. o / p показывает столбцы в таблице.
  4. Выберите нужные столбцы
  5. Скопируйте и вставьте их в выбранный запрос
  6. Запустить запрос.

Наслаждайтесь.

7 голосов
/ 19 мая 2010

В SQL Management Studio вы можете развернуть столбцы в обозревателе объектов, а затем перетащить элемент дерева Columns в окно запроса, чтобы получить список столбцов через запятую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...