多次从同一个表中连接相同的列

时间:2013-02-01 16:08:44

标签: sql join alias

我需要从同一个表中检索两个数据,但需要分成不同的列。

第一个表格“产品”包含以下列:

  • PROD_ID
  • PRO_TYPE_ID
  • PRO_COLOR_ID
  • PRO_WEIGHT_ID
  • PRO_PRICE_RANGE_ID

第二个表格“ COUNTRY_TRANSLATIONS ”包含以下列:

  • ATTRIBUTE_ID
  • ATT_LANGUAGE_ID
  • ATT_TEXT_ID

第三张和最后一张表“ TEXT_TRANSLATIONS ”包含以下列:

  • TRANS_TEXT_ID
  • TRA_TEXT

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多种语言版本,因此需要为每个属性使用整数。

有关如何构建查询的任何建议?谢谢。

1 个答案:

答案 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. 所有内容都在同一个表格中(特别是没有“属性类型”列)。
  2. 语言属性位于错误的表格中。
  3. 对于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,并将本地化文本与它本地化的内容直接联系起来。