Динамическое объединение MySQL таблиц - PullRequest
0 голосов
/ 16 января 2020

Я пишу MySQL хранимую процедуру, которая должна объединить «базовую» таблицу с другими таблицами. К какой другой таблице присоединиться, зависит от поля в базовой таблице.

Это базовая таблица:

ID - Value - JoinValue - TableToJoin - FieldToJoin
---------------------------------------------------
 1 - Test  - aa        - tbl_test1   - test1field
 2 - Test2 - bb        - tbl_test2   - test2field

В качестве выходных данных я хочу иметь:

ID - Value - ValueFromOtherTable
----------------------------------------------
aa  - Test  - ValueFromTBL_TEST1Field
bb  - Test2 - ValueFromTBL_TEST2Field

Возможно ли это как-то? Может быть, как-то так?

SELECT
 ID,
 Value,
 (SELECT @FieldToJoin FROM @TableToJoin AS t WHERE t.ID = @JoinValue) AS ValueFromOtherTable
FROM tbl_base;

Уже попробовал что-то вроде JOIN, но, к сожалению, я не смог найти ответ.

Привет, xola

1 Ответ

1 голос
/ 16 января 2020

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

SELECT stuff 
   , COALESCE(t2.something, t3.something, ....) AS otherTsomething
FROM t1
LEFT JOIN t2 ON t1.TableToJoin = "t2" 
   AND t1.JoinValue = CASE t1.FieldToJoin WHEN "a" THEN t2.a WHEN "b" THEN t2.b .... END
LEFT JOIN t3 ON t1.TableToJoin = "t3" 
   AND t1.JoinValue = CASE t1.FieldToJoin WHEN "a" THEN t3.a WHEN "b" THEN t3.b .... END
;

Обычно подходящим планом для данных такого типа является ссылка t1 и t3 на t1, тогда он просто становится ...

SELECT stuff, COALESCE(t2.something, t3.something, ...) AS otherSomething
FROM t1
LEFT JOIN t2 ON t1.id = t2.t1_id
LEFT JOIN t3 ON t1.id = t3.t1_id
;

(Для ваших целей это предполагает до некоторой степени, что только один t2 или t3 будет связан с записью t1, но это будет трудно осуществить, и в общем случае на самом деле не представляет проблемы.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...