Имя параметризованной таблицы

это моя проблема: я хочу проверить строки в таблице, имя которой параметризовано, что-то вроде table_X. Значение X исходит из другой таблицы, поэтому, например, в моей основной таблице у меня есть столбец c_id и столбец X, таблица, к которой нужно присоединиться, имеет имя table_X, она, несомненно, СУЩЕСТВУЕТ, и у нее есть тот же столбец c_id, который я должен присоединиться, чтобы проверить, есть ли значения c_id в этой таблице.

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

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

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

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

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

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

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


person Dippi    schedule 04.10.2011    source источник
comment
Похоже, вам нужно реорганизовать базу данных, чтобы удалить эти зависимости.   -  person eykanal    schedule 04.10.2011


Ответы (2)


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


Если имя таблицы является параметром хранимой процедуры, это может быть в блоках 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
person MatBailie    schedule 04.10.2011
comment
К сожалению, имена таблиц также являются динамическими, поэтому я не могу их жестко закодировать. НО, я знаю, создается ли и когда новая таблица (на самом деле я их создаю), поэтому каждый раз, когда я могу динамически удалять и воссоздавать представление, которое будет выполнять СОЕДИНЕНИЕ, которое вы предлагаете. Здорово! Спасибо - person Dippi; 04.10.2011

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

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

SELECT ...
FROM othertable
JOIN bigtable ON othertable.c_id = bigtable.c_id AND othertable.fieldName = bigtable.fieldName
person Marc B    schedule 04.10.2011
comment
да, я знаю, это первое, что я подумал, когда увидел это, но я не проектировал БД, и я знал, что рано или поздно этот дрянной дизайн создаст мне проблемы... :( - person Dippi; 04.10.2011