【问题标题】:Using column as table join with concat使用列作为表连接与 concat
【发布时间】:2019-06-04 22:06:15
【问题描述】:

我一直在尝试加入另一个表,其表名与另一个表中的列中的值匹配。

如果我将表名硬编码为 __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


        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


        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

感谢您考虑我的问题

【问题讨论】:

标签: mysql sql join mariadb


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你不能构造一个表名。

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-25
      • 1970-01-01
      • 2014-11-18
      • 2021-10-03
      • 2019-10-22
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 2012-02-04
      相关资源
      最近更新 更多