Как я могу объединить несколько таблиц из базы данных, которые заканчиваются одинаковыми символами в их имени?

#sql #union #union-all

#sql #объединение #объединение-все

Вопрос:

Я пытаюсь объединить более 30 таблиц в своей базе данных, не перечисляя их все. Все они заканчиваются одинаковыми последними четырьмя символами в их имени.

Я попытался перечислить их все, но мне понадобится более эффективный способ идентифицировать все таблицы, которые заканчиваются четырьмя символами. Я попытался найти способ поиска по названию таблиц.

 select * from [dbo].[AL2019CLFC]
  union
  select * from [dbo].[AR2019CLFC]
  union 
  select * from [dbo].[AZ2019CLFC]
  

…..

Я ожидаю, что найдется способ идентифицировать последние четыре символа ‘CLFC’ из всех таблиц и объединить их.

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

1. Укажите свой движок базы данных. Это невозможно в SQL Server. Я сомневаюсь, что это возможно в любой другой СУБД.

2. Это в SQL server 2014

3. Имеют ли эти таблицы одинаковую структуру? Если это так, вы можете рассмотреть возможность размещения их всех в одной таблице (что, безусловно, упростит ваш запрос). Если это на самом деле разные объекты, вы могли бы сгенерировать динамический SQL. Однако, как отмечает @RicardoC, вам почти наверняка понадобится перечислить каждую таблицу в вашем запросе.

4. @Zack Судя по именам таблиц, они являются следствием дрянного программного обеспечения и создаются автоматически каждый год. Можно с уверенностью предположить одинаковую структуру, иначе объединение не сработало бы 😉 но вы полностью правы, да, сэр.

5. Да, они имеют одинаковую структуру

Ответ №1:

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

Примечание: в приведенных ниже примерах будет приведено ключевое слово завершающего ОБЪЕДИНЕНИЯ, которое следует удалить. Опять же, если вы хотите стать более модным, вы могли бы использовать sql вокруг этого, но, надеюсь, этого будет достаточно, чтобы вы начали.

MS SQL Server:

 select 
'SELECT * FROM '   name   ' UNION ' query
from sys.tables
where name like '%CLFC'
  

Oracle:

 select 
'SELECT * FROM ' || table_name || ' UNION ' query
from user_tables
where table_name like '%CLFC'
  

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

1. Возможно, вы захотите добавить фактический ответ «нет, невозможно», тогда я бы изложил ваш ответ как альтернативу, а не просто предложение. У него нет выбора.

2. Я не согласен с вашей оценкой (и вашими чрезмерно негативными комментариями в исходном сообщении). Мне казалось, что основная суть вопроса заключалась в том, как получить имена всех таблиц, которые заканчивались набором символов (не все знают о sys.tables). Поэтому мой ответ, вероятно, поможет ему решить его цель. Что касается комментария «невозможно», я определенно мог бы создать хранимую процедуру, которая генерирует инструкцию sql и отправляет ее в базу данных, но на данный момент это казалось излишним, когда нужно было просто легко получить таблицы.