Как найти в бд таблицу, которая одновременно содержит два столбца с разными известными нам наименованиями
Вот существует запрос, который позволяет найти в базе данных таблицу, которая содержит столбец с определенным наименованием:
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%А%'
А как составить запрос таким образом, чтобы мы могли найти таблицу, которая в себе содержит столбец с наименованием "А", а также столбец с наименованием "В". То есть, например, есть таблица №1 со столбцами: А, В, С А есть таблица №2 со столбцами: А, D, E Нам надо составить запрос, чтобы отобрать только таблицу № 1
Ответы (3 шт):
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%А%' -- Условие для первого столбца
OR COLUMN_NAME LIKE '%B%' -- Условие для второго столбца
GROUP BY TABLE_SCHEMA, TABLE_NAME
HAVING COUNT(*) = 2
Выбираем все таблицы, которые содержат хотя бы один из двух столбцов, для каждой считаем количество найденных строк, и оставляем те, для которых нашлось ровно 2.
Для MySql можно так:
SELECT t.table_name FROM information_schema.Tables t JOIN information_schema.Columns c ON t.table_name = c.table_name
WHERE t.table_schema = 'my_schema' AND c.column_name='A'
INTERSECT
SELECT t.table_name FROM information_schema.Tables t JOIN information_schema.Columns c ON t.table_name = c.table_name
WHERE t.table_schema = 'my_schema' AND c.column_name='B'
без изысков, в лоб
Друзья, благодарю всех за ваши ответы, заинтересованность и участие. У меня получилось добиться нужного результата с помощью вот такого запроса:
-- Таблицы с колонками, содержащими букву 'A'
WITH TablesWithA AS (
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%А%'
),
-- Таблицы с колонками, содержащими букву 'B'
TablesWithB AS (
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%В%'
)
-- INNER JOIN между двумя этими выборками
SELECT a.TABLE_NAME AS TableWithA
b.TABLE_NAME AS TableWithB
FROM TablesWithA a
INNER JOIN TablesWithB b ON a.TABLE_NAME = b.TABLE_NAME;