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')
目前我正在构建一个工具来 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')