2013-02-01 100 views
0

我需要兩個從同一個表中檢索數據,但分爲不同的列。多次加入同一個表中的同一列

一表 「產品」 有以下欄目:

  • PROD_ID
  • PRO_TYPE_ID
  • PRO_COLOR_ID
  • PRO_WEIGHT_ID
  • PRO_PRICE_RANGE_ID

秒OND表 「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多次(取決於翻譯的howmany可用)。然後ATT_TEXT_ID與TEXT_TRANSLATIONS表中的TRANS_TEXT_ID連接。

基本上我需要運行一個查詢,以便我可以多次從TEXT_TRANSLATIONS中檢索信息。現在我得到一個錯誤,說關聯不是唯一的。

數據可用於20多種語言,因此需要使用每個屬性的整數。

有關如何構建查詢的任何建議?謝謝。

+0

聽起來就像你需要多次加入TEXT_TRANSLATIONS表。但提供一些樣本數據和期望的結果將有助於回答您的問題。 – Taryn

回答

0

希望你在支持的CTE(除了MySQL的幾乎一切),或者你必須修改這個每次指連接表的RDBMS ...

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. 語言屬性位於錯誤的表格中。

對於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,並將本地化文本與直接本地化的文本相關聯。