使用列作为表与concat联接

时间:2019-01-10 04:13:22

标签: mysql sql join mariadb

我一直在尝试联接另一个表,该表的名称与另一个表的列中的值匹配。

如果我将表名硬编码到__gun之类的匹配表中,则可以正常工作,但我无法获得要使用的col值+ concat下划线开头。

问题出在这里的left join

left join CONCAT('__', b.related_table) c on b.related_id = c.id

我需要在连接中使用related_table列。加上__。

尝试:

        SELECT a.*, c.*, b.equipable, b.related_table FROM inventory a
        inner join items b on a.item_id = b.id
        left join CONCAT('__', b.related_table) c on b.related_id = c.id
        WHERE 1=1
        and a.id = :inventory_id
        and a.user_id = :user_id

enter image description here


        SELECT a.*, c.*, b.equipable, b.related_table FROM inventory a
        inner join items b on a.item_id = b.id
        left join '__'+b.related_table c on b.related_id = c.id
        WHERE 1=1
        and a.id = :inventory_id
        and a.user_id = :user_id

enter image description here


        SELECT a.*, c.*, b.equipable, b.related_table FROM inventory a
        inner join items b on a.item_id = b.id
        left join "__"+Cast(b.related_table as nvarchar(4000)) c on b.related_id = c.id
        WHERE 1=1
        and a.id = :inventory_id
        and a.user_id = :user_id

enter image description here

感谢您考虑我的问题

2 个答案:

答案 0 :(得分:0)

您不能构造表名。

计划A:重新考虑架构。具有多个“相同”表通常是通常的糟糕设计。

计划B:编写一个存储过程,该存储过程使用CONCATPREPAREEXECUTEDEALLOCATE_PREPARE来构建和运行查询。

答案 1 :(得分:0)

您可以使用Prepared Statements进行此操作,也可以说动态SQL。请按照下列步骤操作:

  1. 使用 SET 作为表名。
  2. 使用 CONCAT 获取所需的表名。
  3. 在步骤1创建的表的
  4. PREPARE 语句。
  5. EXECUTE 语句。
  6. DEALLOCATE PREPARE 释放准备好的语句。