基本上,我有两个表,表A包含我要拿出的实际项目,表B用于语言翻译。
因此,例如,表A包含实际内容。在表中随时使用文本,而不是存储实际的varchar值,而是存储与表B中存储的文本相关的ID。这使我可以通过向表B中添加languageID列来对表中的同一行进行多次翻译数据库。
例子:
我的问题更多是要求就如何最好地解决此问题提出建议。理想情况下,我需要一个查询,我可以使用该查询从表中进行选择,并从表中获取与文本ID相对的文本。当前,当我在表中有两个文本项时,这就是我要做的:
SELECT C.ID, C.Title, D.Text AS Description FROM (SELECT A.ID, A.Description, B.Text AS Title FROM TableA A, TranslationsTable B WHERE A.Title = B.TextID AND B.LanguaugeID = 1) C LEFT JOIN TranslationsTable D ON C.Description = D.TextID AND D.LanguaugeID = 1
该查询使我从表AI中寻找的行(使用内部select语句中的where语句)具有基于所使用的语言ID而不是文本ID的实际文本。
当我仅使用一个或两个需要翻译的文本项,但是添加了第三个或更多的文本项时,这种方法就很好用了,它开始变得非常混乱-本质上是该示例顶部的另一个左连接。
对更好的查询有任何建议,或者至少是一种在一行中处理3个或更多文本项的好方法吗?
根据建议,我添加了两个表的示例:
Table A --------------------------- ID |Title |Description --------------------------- 1 |1 |2 --------------------------- 2 |3 |4 --------------------------- Table B (Translations Table) --------------------------- ID |LanguaugeID|Text --------------------------- 1 |1 |Here is title one --------------------------- 1 |2 |Here is a title one in espanol --------------------------- 2 |1 |Here is description one --------------------------- 2 |2 |Here is description one in espanol --------------------------- 3 |1 |Title 2 --------------------------- 4 |1 |Description 2 ---------------------------
我想要的是能够从已经有表B中的文本的表A中拉出一行,而不仅仅是ids-并且能够对需要翻译的几列执行此操作。
考虑使用函数为需要翻译的每一列返回数据。一种可能是:
CREATE FUNCTION dbo.fTranslate (@TextId int, @LanguageId int) RETURNS nvarchar(100) -- Should use nvarchar, and set to max length of string AS BEGIN SELECT [Text] -- Reserved wordin SQL, rename that column! FROM TableB WHERE TextId = @TextId And LanguageId = @LanguageId END
然后将查询写为:
SELECT ID, dbo.fTranslate(Title, @LanguageId) Title, dbo.fTranslate(Description, @LanguageId) Description FROM TableA
这可能效果不佳,因为您必须为返回的每一行的每个翻译列调用一次函数(即,每100行3列= 300个函数调用),但是如果您一次只返回一行,它的性能可能不会那么差。测试一下并保持警惕。