2010-09-29 99 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)中執行此操作可能更容易。但不是將其作爲變量(並且建議容易受到注入攻擊的影響),請爲不同的連接組合創建單獨的類。使用另一個類(如調度程序)來確定要實例化的正確類。

相關問題