SQL 行列数据交换

SQL row column data swapping

目前我正在构建一个工具来 add/update 翻译数据并为使用该数据的程序生成一个 XML 文件。

我读取了 XML 文件并将其存储在数据库中,以便我们以后也可以使用这些数据来创建其他翻译文件。

为了将数据库中的数据导入工具,我根据大量可能的翻译(存储在不同的 table 中)生成了一个 SQL 查询,并将它们与基于翻译的数据结合起来在身份证上。 在该工具中,我使用的是数据表,为此我试图将行数据动态交换到列。这应该很容易,但我正在努力。

有两个 table,一个是区域设置,一个是数据。

[dbo].[Locales]
    [Id] [int] IDENTITY(1,1) NOT NULL
    [Locale] [nvarchar](10) NOT NULL

[dbo].[Translations]
    [Id] [int] IDENTITY(1,1) NOT NULL
    [TranslationID] [int] NOT NULL
    [Text] [nvarchar](max) NULL
    [LocaleID] [int] NOT NULL

翻译数据如下:

翻译ID 文字 语言环境
1 连接器 es_ES
1 安施卢斯 de_DE
1 连接点 en_US
1 安斯鲁廷根 nl_NL
2 Spannungsversorgung de_DE
2 电源 en_US

我想要什么:

翻译ID nl_NL en_US de_DE es_ES x_X
1 安斯鲁廷根 连接点 安施卢斯 连接器
2 沃丁 电源 Spannungsversorgung 一些语言

我尝试使用 LEFT JOIN 和 OUTER JOIN 获取数据,但均未成功。问题是并不是所有的翻译数据都可用(这就是为它构建工具的原因)。我也找到了“PIVOT”,但它看起来无法生成我想要的数据,因为 PIVOT 需要一个聚合函数。

提前致谢!

如果您不想使用 PIVOT,您可以获取唯一翻译 ID 列表:

SELECT TranslationID
FROM Translations
GROUP BY TranslationID

然后用子查询获取各个语言环境(为了简洁起见,我在 Translations 上放了一个 Locale 列):

SELECT
    UniqueTID,
    (SELECT Text FROM Translations t WHERE (TranslationID = UniqueTID AND Locale = 'nl_NL') as nl_NL,
    (SELECT Text FROM Translations t WHERE (TranslationID = UniqueTID AND Locale = 'en_US') as en_US,
    (SELECT Text FROM Translations t WHERE (TranslationID = UniqueTID AND Locale = 'de_DE') as de_DE
FROM (
    SELECT TranslationID as UniqueTID
    FROM Translations
    GROUP BY TranslationID
) uniqTIDs

或外连接:

SELECT
    UniqueTID,
    nlTrans.Text as nl_NL,
    enTrans.Text as en_US,
    deTrans.Text as de_DE
FROM (
    SELECT TranslationID as UniqueTID
    FROM Translations
    GROUP BY TranslationID
) uniqueTIDs
    LEFT JOIN Translations nlTrans ON (nlTrans.TranslationID = UniqueTID AND nlTrans.Locale = 'nl_NL')
    LEFT JOIN Translations enTrans ON (enTrans.TranslationID = UniqueTID AND enTrans.Locale = 'en_US')
    LEFT JOIN Translations deTrans ON (deTrans.TranslationID = UniqueTID AND deTrans.Locale = 'de_DE')