Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将数据表与查找表联接以修复错误数据_Sql_Database - Fatal编程技术网

Sql 将数据表与查找表联接以修复错误数据

Sql 将数据表与查找表联接以修复错误数据,sql,database,Sql,Database,假设我有两张桌子: 数据表: CURRENCY COUNTRY VAT MODE USD US FREEVAT AIR EUR ESP FREEVAT SEA GBP UK FREEVAT ROA 查找: COLUMN_NAME INPUT_VALUE OUTPUT_VAL

假设我有两张桌子:

数据表:

CURRENCY       COUNTRY       VAT           MODE
USD            US            FREEVAT       AIR
EUR            ESP           FREEVAT       SEA
GBP            UK            FREEVAT       ROA
查找:

COLUMN_NAME     INPUT_VALUE    OUTPUT_VALUE
COUNTRY         US             United States
COUNTRY         ESP            Spain
COUNTRY         UK             United Kingdom
VAT             FREEVAT        0
是否有办法在SELECT语句中联接这些表,以便用列名称替换匹配项?
有更好的结构化方法解决此问题吗?

您可以使用
连接,但需要明确列名称:

select d.currency,
       coalesce(lc.output_value, d.country) as country,
       coalesce(lv.output_value, d.vat) as vat,
       d.mode
from data d left join
     lookup lc
     on lc.input_value = d.country and
        lc.column_name = 'COUNTRY' left join
     lookup lv
     on lv.input_value = d.vat and
        lv.column_name = 'VAT'

您可以使用
join
,但需要明确列名称:

select d.currency,
       coalesce(lc.output_value, d.country) as country,
       coalesce(lv.output_value, d.vat) as vat,
       d.mode
from data d left join
     lookup lc
     on lc.input_value = d.country and
        lc.column_name = 'COUNTRY' left join
     lookup lv
     on lv.input_value = d.vat and
        lv.column_name = 'VAT'

这是一种非常糟糕的方法,您应该有单独的列,甚至单独的表来保存不同实体的数据(例如在您的示例country和vat中)@eshirvana这是一个虚构的示例,我试图在这里实现的是ELT中一系列过程中的一个过程,它将修复接收到的数据。这是一种非常糟糕的方法,您应该有单独的列,甚至单独的表来保存不同实体的数据(如您的示例国家和增值税)@eshirvana这是一个虚构的示例,我试图在这里实现的是ELT内一系列过程中的一个过程,它将修复接收到的数据。第二个
合并
应该是
lv
而不是
lc
。除此之外,答案和往常一样非常好。谢谢你的回答,这非常有效,但是如果我的数据表中的列数变大,事情会变得非常糟糕。有没有其他方法可以避免继续在连接上添加连接?@rstici。如果需要跨多个不相关的列执行此重新编码问题,我想不出一个简单的解决方案。第二个
coalesce
应该是
lv
而不是
lc
。除此之外,答案和往常一样非常好。谢谢你的回答,这非常有效,但是如果我的数据表中的列数变大,事情会变得非常糟糕。有没有其他方法可以避免继续在连接上添加连接?@rstici。如果需要跨多个不相关的列进行重新编码,我想不出一个简单的解决方案。