SQL 左连接将多行合并为一行

bea*_*edd 5 sql t-sql database sql-server

基本上,我有两个表,表 A 包含我想要取出的实际项目,表 B 用于语言翻译。

例如,表 A 包含实际内容。每当在表中使用文本时,都会存储与表 B 中存储的文本相关的 id,而不是存储实际的 varchar 值。这使我可以通过向表 B 中添加 languageID 列,为表中的同一行提供多个翻译。数据库。

例子:

表A

  • 标题(整数)
  • 描述(整数)
  • 其他数据....

表B

  • TextID (int) - 这是其值存储在其他表中的列
  • 语言 ID (int)
  • 文本(varchar)

我的问题更多的是呼吁就如何最好地处理这个问题提出建议。理想情况下,我想要一个可以用来从表中进行选择的查询,并从表中获取文本而不是文本的 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
Run Code Online (Sandbox Code Playgroud)

此查询为我提供了表 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
    ---------------------------   
Run Code Online (Sandbox Code Playgroud)

我想要的是能够从表 A 中提取一行,该行已经包含表 B 中的文本,而不仅仅是 ids - 并且能够对需要翻译的多个列执行此操作。

Phi*_*ley 1

研究使用函数来返回需要翻译的每列的数据。其中之一可能是:

\n\n
CREATE FUNCTION dbo.fTranslate\n    (@TextId int, @LanguageId int)\nRETURNS nvarchar(100)  --  Should use nvarchar, and set to max length of string\nAS\n BEGIN\n    SELECT [Text]  --  Reserved wordin SQL, rename that column!\n     FROM TableB\n     WHERE TextId = @TextId\n      And LanguageId = @LanguageId\n END\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后将查询编写为:

\n\n
SELECT\n  ID,\n  dbo.fTranslate(Title, @LanguageId) Title,\n  dbo.fTranslate(Description, @LanguageId) Description\n FROM TableA\n
Run Code Online (Sandbox Code Playgroud)\n\n

这可能不会表现得特别好,因为您必须为返回的每一行的每个翻译列调用该函数一次(即 100 行的 3 列 = 300 次函数调用),但如果您\xe2\x80\x99re 仅返回一行有一段时间,它的表现可能不会那么差。测试一下并保持警惕。

\n