使用单个查找表更新多列

kx1ctssn  于 2021-08-01  发布在  Java
关注(0)|答案(1)|浏览(330)

我正在使用azuresql数据库创建一个使用powerbi的报告。我需要用越南语创建一个报告,我已经复制了我的数据库,现在正试图将英文文本数据翻译成越南语。为了实现这一点,我创建了一个查找表,其中包含英文文本以及两个不同列中相应的翻译。我的数据表可以有两个或更多列,其中包含英文文本,我应该在查找表中查找,以获取越南语文本,并用翻译的文本替换更新英文数据。数据表(我可以有多个英文数据表):

+-------------+-------------+-------------+----------------+-----------------+
|   id        | eng_col1    | eng_col2    | eng_col3       |  eng_col4       |
|             |             |             |                |                 |
+----------------------------------------------------------------------------+
|   1         |  hello      |             |      hello     |     yes         |
|             |             |    no       |                |                 |
+----------------------------------------------------------------------------+
|   2         |             |   no        |    hello       |                 |
|             |  world      |             |                |     no          |
+----------------------------------------------------------------------------+
|    3        |  yes        |    hello    ||      yes      |    world        |
+-------------+-------------+------------------------------+-----------------+

查阅表格(仅一个查阅表格,其中包含所有表格中的所有英文文本):

+-------------+--------------
|   english   | vietnamese  |
|             |             |
+---------------------------+
|   yes       |  Đúng       |
|             |             |
+---------------------------+
|   no        |             |
|             |  Không      |
+---------------------------+
|    hello    |xin chào     |
+---------------------------+
| world       | thế giới    |
|             |             |
+-------------+-------------+

有没有办法一次性更新所有的表?还是需要分别为每个表编写更新查询?短暂性脑缺血发作

xytpbqjk

xytpbqjk1#

在不了解完整数据模型的情况下,您可以尝试以下两种方法
方案1
如果所有列都具有相同的名称,则可以编写一个查询,并在具有相同名称的所有表上执行它们 sp_MsForEachTable 例子:

exec sp_MsForEachTable 'UPDATE x SET Column = lt.Vietnamese FROM ? x INNER JOIN lookupTable lt on lt.English = x.Column'

方案2
您还可以基于 sys.tables 以及 sys.columns . 例子:

SELECT CONCAT('UPDATE x SET ', QUOTENAME(c.Name) , ' = lt.Vietnamese FROM ' , QUOTENAME(SCHEMA_NAME(t.Schema_Id)), '.', QUOTENAME(t.Name), ' x 
INNER JOIN lookupTable lt on lt.English = x.', QUOTENAME(c.Name))
FROM sys.Tables t
INNER JOIN sys.Columns c on c.Object_Id = t.Object_Id
-- Or use a different custom condition 
WHERE t.Name IN (/*Tables you want to update*/)
AND c.Name IN (/*Columns you want to update*/)

这个查询的输出,可以用来在多个表上执行多个语句。

相关问题