Параметризованное имя таблицы - PullRequest
1 голос
/ 04 октября 2011

это моя проблема: я хочу проверить строки таблицы, имя которой параметризовано, что-то вроде table_X. Значение X взято из другой таблицы, поэтому, например, в моей основной таблице у меня есть столбец c_id и столбец X, таблица для объединения имеет имя table_X, без сомнения, существует, и имеет тот же столбец c_id, к которому я присоединюсь, чтобы проверить, есть ли значения c_id в этой таблице.

  1. Я пробовал представление, но безуспешно, потому что не могу поместить параметризованное имя таблицы в представление. Я могу параметризировать, где предложения и другие вещи, но без имен таблиц.

  2. Я пробовал процедуру, с

    SET @q = CONCAT('select blabla from table_', X);
    PREPARE stmt FROM @q;
    EXECUTE stmt;
    

    но процедуры не могут возвращать значения, и мне это нужно, потому что мне нужно знать, есть ли значение в параметризованной таблице c_id, иначе это бесполезно.

  3. Я пробовал функцию, но «Динамический SQL не разрешен в хранимой функции или триггере»

Так что я могу сделать, чтобы извлечь эти данные? Я вызываю это представление / функцию / что угодно из PHP, и я знаю, что могу сделать это со стороны PHP, с двумя запросами, но мне нужно сделать это на стороне базы данных для будущих реализаций. Возможно ли это?

ПРИМЕЧАНИЕ: я не могу изменить структуру БД :) Кстати, это Limesurvey db, звучит как сумасшедшая структура БД, да?

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

Единственный способ, без динамического построения запросов, - это жестко кодировать каждую комбинацию и выбирать ту, которая вам нужна.


Если имя таблицы является параметром хранимой процедуры, это может быть в блоках 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


Или вы можете передать NULL для полей, которых нет в исходной таблице ...

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
2 голосов
/ 04 октября 2011

Зачем вам нужны такие отдельные таблицы? Обычно это признак плохого дизайна. Не проще ли создать одну таблицу с полем идентификатора для любого значения X`, к которому принадлежит запись, к которой вы можете присоединиться / отфильтровать?

Это уменьшит запрос до

SELECT ...
FROM othertable
JOIN bigtable ON othertable.c_id = bigtable.c_id AND othertable.fieldName = bigtable.fieldName
...