希望你在支持的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),這主要是一個問題,因爲您現在必須維護所有屬性值的系統範圍唯一性。我幾乎可以保證,在某些時候,你會碰到'重複'。另外,除非您設計了可用空間爲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,並將本地化文本與直接本地化的文本相關聯。
聽起來就像你需要多次加入TEXT_TRANSLATIONS表。但提供一些樣本數據和期望的結果將有助於回答您的問題。 – Taryn