小编典典

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

sql

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

因此,例如,表A包含实际内容。在表中随时使用文本,而不是存储实际的varchar值,而是存储与表B中存储的文本相关的ID。这使我可以通过向表B中添加languageID列来对表中的同一行进行多次翻译数据库。

例子:

表A

  • Title (int)
  • Description (int)
  • Other Data....

表B

  • TextID (int) - This is the column whose value is stored in other tables
  • LanguageID (int)
  • Text (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

该查询使我从表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-并且能够对需要翻译的几列执行此操作。


阅读 350

收藏
2021-04-22

共1个答案

小编典典

考虑使用函数为需要翻译的每一列返回数据。一种可能是:

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个函数调用),但是如果您一次只返回一行,它的性能可能不会那么差。测试一下并保持警惕。

2021-04-22