#mysql #sql #parameterized
#mysql #sql #параметризованный
Вопрос:
это моя проблема: я хочу проверить строки в таблице, имя которой параметризовано, что-то вроде table_X
. Значение X происходит из другой таблицы, поэтому, например, в моей основной таблице у меня есть столбец c_id
и столбец X, таблица для объединения имеет имя table_X , она, несомненно, СУЩЕСТВУЕТ, и в ней есть тот же столбец c_id
, к которому я присоединюсь, чтобы проверить, есть ли значения c_id
вэта таблица.
-
Я пробовал представление, но безуспешно, потому что я не могу поместить параметризованное имя таблицы в представление. Я могу параметризовать предложения where и другие вещи, но без имен таблиц.
-
Я попробовал процедуру с
SET @q = CONCAT('select blabla from table_', X); PREPARE stmt FROM @q; EXECUTE stmt;
но процедуры не могут возвращать значения, а мне это нужно, потому что мне нужно знать, есть ли
c_id
значение в параметризованной таблице, иначе это бесполезно. -
Я пробовал функцию, но «Динамический SQL не разрешен в сохраненной функции или триггере»
Итак, что я могу сделать, чтобы извлечь эти данные? Я вызываю это представление / функцию / что угодно из PHP, и я знаю, что могу сделать это со стороны PHP с помощью двух запросов, но мне нужно сделать это на стороне db для будущих реализаций. Возможно ли это?
ПРИМЕЧАНИЕ: я не могу изменить структуру БД 🙂 кстати, это база данных Limesurvey, звучит как сумасшедшая структура БД, да?
Комментарии:
1. Похоже, вам нужно провести рефакторинг вашей базы данных, чтобы удалить эти зависимости.
Ответ №1:
Единственный способ, без динамического построения запросов, — это жестко закодировать каждую комбинацию и выбрать ту, которую вы хотите.
Если имя таблицы является параметром хранимой процедуры, это может быть в блоках IF. Но это кажется неуклюжим.
Если поля из каждой таблицы совпадают, вы можете объединить таблицы вместе и выбрать из них…
CREATE VIEW myUnifiedStructure AS
SELECT 'Table1' AS tableName, * FROM Table1
UNION SELECT 'Table2' AS tableName, * FROM Table2
UNION SELECT 'Table3' AS tableName, * FROM Table3
-- etc
SELECT * FROM myUnifiedStructure WHERE tableName = 'Table1'
Если поля в каждой таблице разные, вас может интересовать только подмножество полей…
CREATE VIEW myUnifiedStructure AS
SELECT 'Table1' AS tableName, field1 AS field1, field4 AS field2 FROM Table1
UNION SELECT 'Table2' AS tableName, field2 AS field1, field3 AS field2 FROM Table2
UNION SELECT 'Table3' AS tableName, field2 AS field1, field4 AS field2 FROM Table3
-- etc
Или вы можете передать нули для полей, которые не существуют в исходной таблице…
CREATE VIEW myUnifiedStructure AS
SELECT 'Table1' AS tableName, NULL AS field1, field2 AS field2 FROM Table1
UNION SELECT 'Table2' AS tableName, field1 AS field1, field2 AS field2 FROM Table2
UNION SELECT 'Table3' AS tableName, field1 AS field1, NULL AS field2 FROM Table3
-- etc
Комментарии:
1. К сожалению, имена таблиц также являются динамическими, поэтому я не могу их жестко запрограммировать. НО я знаю, когда и когда создается новая таблица (на самом деле я их создаю), поэтому каждый раз я могу динамически удалять и воссоздавать представление, которое будет выполнять ОБЪЕДИНЕНИЕ, которое вы предлагаете. Отлично! Спасибо
Ответ №2:
Зачем вам нужны такие отдельные таблицы, как эта? Обычно это признак плохого дизайна. Разве не было бы проще создать единую таблицу с полем идентификатора для любого значения X`, которому принадлежит эта запись, которую вы можете объединить / отфильтровать?
Это сократило бы запрос до чего-то вроде
SELECT ...
FROM othertable
JOIN bigtable ON othertable.c_id = bigtable.c_id AND othertable.fieldName = bigtable.fieldName
Комментарии:
1. да, я знаю, это первое, что я подумал, когда увидел это, но я не определил DB, и я знал, что рано или поздно этот дерьмовый дизайн доставит мне проблемы … 🙁