SQL .Как: Выбрать * из таблиц, которые начинаются как data.PIR

#sql #sql-server

#sql #sql-сервер

Вопрос:

Представьте, что у меня есть несколько таблиц sql, они названы:

 data.PIR_12
data.PIR_13
data.Pir_2455
data.Pir_somedata
  

Могу ли я сделать какой-то выбор, подобный

 select * from data.PIR% where code = 'mycode'
  

Или это невозможно, поскольку схема может быть другой?

Комментарии:

1. Пожалуйста, добавьте свою СУБД (Sql Server, Oracle, MySQL и так далее …)

2. @JoeTaras MSSQL

3. Нет, это невозможно просто так. Это показывает, что ваш дизайн таблицы неправильный. Вы действительно должны это изменить

4. @mouchin777 ни один продукт базы данных не позволяет этого . Таблицы являются фундаментальными конструкциями в SQL, аналогичными типам в функциональных или строго типизированных языках. Запрос не выполняется сам по себе, сервер использует его для создания плана выполнения на основе фактических столбцов, доступных индексов и статистики данных. Фактически, то, что вы просите, может завершиться неудачей просто потому, что таблицы содержат разные столбцы

5. И да, дизайн неправильный. Если у вас нет по крайней мере десятков миллионов записей, нет причин разбивать одну таблицу на несколько таблиц. Вы не получите лучшей производительности (совсем наоборот). Если вы хотите управлять миллионами строк, возможно, для архивирования или удаления старых данных, вы можете использовать секционирование SQL Server, доступное во всех поддерживаемых версиях и выпусках. Чтобы ускорить работу, используйте правильные индексы , а не разделение

Ответ №1:

Я бы поддержал комментарии, в которых говорится «пожалуйста, исправьте свою структуру данных». Пожалуйста, найдите нормализацию данных и долго думайте, прежде чем внедрять что-то подобное.

Только когда вы достигнете огромных масштабов, вам может понадобиться что-то, приближающееся к сегментам данных..

Если вы считаете, что вам это нужно, потому что у вас разное содержимое данных, вернитесь к нормализации и рассмотрите возможность дальнейшего абстрагирования. Вы можете получить как можно более абстрактное значение (имя, значение)

Тем не менее, если вы знаете структуру и уверены, что динамические имена таблиц являются ответом, то в sqlserver вы могли бы создать динамический sql.

 declare @sql nvarchar(2000), @sometable nvarchar(50), @myid nvarchar(10)
set @sometable='_12'
set @myid = '12'
set @sql = 'select name from data.pir'   @sometable   ' where value=' @myid
exec @sql
  

но у вас, вероятно, уже много проблем — с этими запросами сложно обрабатывать результаты или оборачивать обработку ошибок.

Вы можете выбрать из представлений метаданных, чтобы получить свой список таблиц. Или поместите список таблиц в таблицу собственного дизайна. И напишите итератор для обработки выходных метаданных с вашим динамическим sql.

существуют варианты для динамического sql, но я бы предложил давно устаревший (раньше они были нацелены на динамические предложения where для сложных специальных запросов).

В прошлом я использовал эти запросы для выполнения очень большого количества межсерверных вызовов (вызывается один и тот же sp, меняется только имя сервера (и есть временные причины для сериализации всех вызовов, что делает итерацию цикла наиболее эффективным подходом)

Ответ №2:

Предполагая, что есть веская причина для структурирования таблиц так, как они у вас есть, и предполагая, что список таблиц фиксирован, вы можете использовать объединение:

 SELECT Column1, Column2, Column3 ... FROM data.PIR_12
UNION SELECT Column1, Column2, Column3 ... FROM data.PIR_13
UNION SELECT Column1, Column2, Column3 ... FROM data.Pir_2455
UNION SELECT Column1, Column2, Column3 ... FROM data.Pir_somedata
WHERE Column3 = 'mycode'
  

Обратите внимание, что я опустил «ВЫБРАТЬ *», что считается плохой практикой.