Oracle 11g。我有文本的ML(多语言)子表,每个父/语言有一个子表。因此,对于父表PRODUCT,我有PRODUCT_EN,PRODUCT_FR等。我希望有一个组合所有ML表的视图。当我查询特定语言时,我希望Oracle优化器(Join Elimination?)足够智能,只能访问所需的ML表。因此,如果我指定lan_id(语言ID)= 5(法语),它应该忽略英语和其他翻译表。 这里有几个视图返回正确的数据,但从计划中我看到一个针对法语的查询仍然访问英语:
CREATE OR REPLACE VIEW myproduct_ml AS
SELECT p.PROD_ID, STATUS,
ml.lan_id, ml.prod_name
FROM myproduct p JOIN
(SELECT en.* FROM myproduct_en en WHERE lan_id = 1
UNION ALL
SELECT fr.* FROM myproduct_fr fr WHERE lan_id = 5) ml
ON (p.prod_id = ml.prod_id);
CREATE OR REPLACE VIEW myproduct_ml AS
SELECT p.PROD_ID, STATUS,
ml.lan_id, ml.prod_name
FROM myproduct p JOIN myproduct_en ml ON (p.prod_id = ml.prod_id) WHERE lan_id = 1
UNION ALL
SELECT p.PROD_ID, STATUS,
ml.lan_id, ml.prod_name
FROM myproduct p JOIN myproduct_fr ml ON (p.prod_id = ml.prod_id) WHERE lan_id = 5;
select * from myproduct_ml WHERE lan_id = 5 ;
lan_id不需要在ML表中,因为后缀指定了语言。
答案 0 :(得分:1)
为什么每种语言都有一个单独的表?这意味着每次引入新语言时都必须添加一个表,并且必须更改所有查询。那一定不是。添加的数据应该仅导致添加的行,以便查询继续工作。
所以改成这个语言表就完成了。