2010-09-29 94 views
2

我正在尝试为产品创建一个类继承设计。有没有办法在查询中使表名称动态化?

存在包含所有常用字段的基表。然后对于每个产品类型有包含有该产品类型的字段一个单独的表仅

因此,为了让所有的数据产品,我需要JOIN与任何表相关的product_type基表列在基表中。有没有办法让这个查询动态地加入到表上?

下面是一个查询,试图说明什么,我试图做的:

SELECT * FROM product_base b 
INNER JOIN <value of b.product_type> t 
    ON b.product_base_id = t.product_base_id 
WHERE b.product_base_id = :base_id 

有没有办法做到这一点?

回答

9

不,没有办法做到这一点。在解析查询时必须知道表名,因此解析器可以知道表是否存在,并且它包含您引用的列。此外,优化器需要知道表及其索引,因此它可以提出使用哪些索引的计划。

您要求的是根据逐行查找的数据在执行过程中确定表。 RDBMS无法在分析时知道数据值对应于真实表,因此全部为

您没有理由执行此操作来执行Class Table Inheritance。 CTI支持表之间的真实引用。

你反而描述了多态协会的antipattern

+0

+1为反模式。 – 2010-09-29 19:18:33

1

制作2查询:
首先选择b.product_type的<值>,然后在第二个(你有一个使用它,但更换b.product_type的<值>与从第一个结果)。

0

没有。即使可能,也没什么意义,因为查询优化器如果不知道连接右侧的任何信息,就无法制定计划。

您需要使用串联或类似方法构造查询,但要确保只使用有效的表名来避免注入式攻击。

0

您可以创建一个将表名称作为参数并构造动态SQL查询的过程。但在服务器端代码(PHP)中执行此操作可能更容易。但不是将其作为变量(并且建议容易受到注入攻击的影响),请为不同的连接组合创建单独的类。使用另一个类(如调度程序)来确定要实例化的正确类。

相关问题