我需要从同一个表中检索两个数据,但需要分成不同的列。
第一个表格“产品”包含以下列:
第二个表格“ COUNTRY_TRANSLATIONS ”包含以下列:
第三张和最后一张表“ TEXT_TRANSLATIONS ”包含以下列:
PRO_TYPE_ID,PRO_COLOR_ID,PRO_WEIGHT_ID和PRO_PRICE_RANGE_ID都是整数,并且多次在ATTRIBUTE_ID列中找到(取决于有多少可用的翻译)。然后ATT_TEXT_ID与TEXT_TRANSLATIONS表中的TRANS_TEXT_ID连接。
基本上我需要运行一个查询,这样我就可以多次从TEXT_TRANSLATIONS中检索信息。现在我得到一个错误,说相关性不是唯一的。
数据有20多种语言版本,因此需要为每个属性使用整数。
有关如何构建查询的任何建议?谢谢。
答案 0 :(得分:0)
希望您使用的是支持CTE的RDBMS(几乎所有除了mySQL之外的所有内容),或者您每次都必须修改它以引用连接表...
WITH Translations (attribute_id, text)
as (SELECT c.attribute_id, t.tra_text
FROM Country_Translations c
JOIN Text_Translations t
ON t.trans_text_id = c.att_text_id
WHERE c.att_language_id = @languageId)
SELECT Products.prod_id,
Type.text,
Color.text,
Weight.text,
Price_Range.text
FROM Products
JOIN Translations as Type
ON Type.attribute_id = Products.pro_type_id
JOIN Translations as Color
ON Color.attribute_id = Products.pro_color_id
JOIN Translations as Weight
ON Weight.attribute_id = Products.pro_weight_id
JOIN Translations as Price_Range
ON Price_Range.attribute_id = Products.pro_price_range_id
当然,我个人认为本地化表的设计有两种方式 -
对于1),这通常是一个问题,因为您现在必须维护所有属性值的系统范围唯一性。我几乎可以保证,在某些时候,你会遇到'重复'。此外,除非您使用 lot 的可用空间设计范围,否则数据值对于类型而言是非连续的;如果你不小心,更新语句可能会运行错误的值,只是因为给定范围的开始和结束属于同一属性,而不是范围内的每个值。
对于2),这是因为文本不能与其语言(以及国家“语言环境”)完全分离。根据我的理解,有些文本的部分内容在多种语言中有效,但在阅读时意味着完全不同的东西。
将本地化存储在与此类似的东西中可能会更好(这里只显示一个表,其余的是读者的练习):
Color
=========
color_id -- autoincrement
cyan -- smallint
yellow -- smallint
magenta -- smallint
key -- smallint
-- assuming CYMK palette, add other required attributes
Color_Localization
===================
color_localization_id -- autoincrement, but optional:
-- the tuple (color_id, locale_id) should be unique
color_id -- fk reference to Color.color_id
locale_id -- fk reference to locale table.
-- Technically this is also country dependent,
-- but you can start off with just language
color_name -- localized text
这应该使所有属性都有自己的一组id,并将本地化文本与它本地化的内容直接联系起来。