Исключить колонку с помощью SELECT * [кроме columnA] FROM tableA?
Заголовок: Как исключить столбцы из выборки в SQL без указания всех столбцов?
Описание проблемы:
Я знаю, что для выбора всех столбцов из таблицы можно использовать следующий запрос:
SELECT * FROM tableA
Однако, есть ли способ исключить один или несколько столбцов из выборки, не указывая все остальные столбцы?
Например, я хотел бы сделать что-то похожее на:
SELECT * [except columnA] FROM tableA
На данный момент единственный способ, который я знаю — это вручную указывать все столбцы, кроме нежелательных, что занимает много времени и сил. Я ищу решение, которое могло бы упростить этот процесс и облегчить будущее сопровождение, особенно если структура таблицы изменится и количество столбцов будет больше или меньше. Есть ли у кого-то опыт или предложения по этому поводу?
5 ответ(ов)
Вы можете попробовать сделать это следующим образом:
/* Поместите данные во временную таблицу */
SELECT * INTO #TempTable
FROM YourTable
/* Удалите ненужные столбцы */
ALTER TABLE #TempTable
DROP COLUMN ColumnToDrop
/* Получите результаты и удалите временную таблицу */
SELECT * FROM #TempTable
DROP TABLE #TempTable
Нет.
Лучшей практикой с минимальными затратами на сопровождение является указание только необходимых столбцов.
Причины как минимум две:
- Это делает ваш контракт между клиентом и базой данных стабильным. Одни и те же данные, каждый раз.
- Производительность, покрывающие индексы.
Изменение (Июль 2011):
Если вы перетащите узел Columns
для таблицы из Обозревателя объектов, то в окне запроса появится список столбцов в формате CSV, что достигает одной из ваших целей.
Современные SQL-диалекты, используемые такими платформами, как BigQuery, Databricks и Snowflake, предлагают отличное решение для выбора столбцов из таблицы. Например, вы можете использовать следующий синтаксис:
SELECT * EXCEPT(ColumnNameX, [ColumnNameY, ...])
FROM TableA
Этот мощный синтаксис SQL позволяет избежать длинного списка столбцов, который необходимо постоянно обновлять из-за изменений в именах столбцов таблицы. К сожалению, такая функциональность отсутствует в текущей реализации SQL Server, что весьма огорчает. Надеюсь, что когда-нибудь это станет стандартом SQL и сделает работу с данными более удобной дляData Scientist'ов.
Для дата-сайентистов важно иметь возможность быстро упростить запрос и исключить некоторые столбцы (например, из-за дублирования или по другим причинам).
Дополнительные ссылки для ознакомления:
Также стоит отметить, что DuckDB использует синтаксис EXCLUDE вместо EXCEPT, что можно найти в документации: DuckDB: Синтаксис запроса.
Автоматизированный способ сделать это в 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);
Этот код динамически создает запрос для выбора всех столбцов из таблицы MyTable
, за исключением указанных столбцов (ColumnIDontWant1
и ColumnIDontWant2
). Сначала он формирует список столбцов, затем строит и выполняет полный SQL-запрос.
Вы можете создать представление (view), в котором будут только те столбцы, которые вам нужны, а затем просто выполните SELECT * FROM имя_представления
.
"Вставка результатов хранимой процедуры в временную таблицу"
Как экранировать одинарную кавычку в SQL Server?
Как выполнить оператор UPDATE с JOIN в SQL Server?
Функция против Хранимой процедуры в SQL Server
Следует ли мне использовать != или <> для обозначения "не равно" в T-SQL?