我有一个国家/地区维度表COUNTRY_DIM,如下所示:

ID SHORT_NAME FULL_NAME ALTERNATE_NAME
US USA United States of America United States
UK UK United Kingdom Great Britain
IN India Republic of India
ROK South Korea Republic of Korea
DE Germany Federal Republic of Germany Deutschland

我有另一个表COUNTRY_FACT,其中有国家名称和一些如下所示的值:

COUNTRY_NAME VALUE
United States 30
India 6
United Kingdom 10
South Korea 2
Republic of Korea 1
Germany 4
USA 2

我想首先加入SHORT_NAME上的两个表,如果不匹配,则FULL_NAME,如果不匹配,则ALTERNATE_NAME,并派生国家ID.

因此输出将如下所示:

COUNTRY_ID VALUE
US 32
IN 6
UK 10
ROK 3
DE 4

我正在使用以下查询:

select dim.country_id,sum(fact.value) value
from contry_fact fact
inner join country_dim dim
on
case when upper(country_name) = upper(short_name) then 1
when upper(country_name) = upper(full_name) then 1
when upper(country_name) = upper(alternate_name) then 1
else 0 end = 1
group by dim.country_id

这是获得所需输出的正确方法,还是我们可以通过其他方式实现?

我用Oracle 19c

推荐答案

当您在JOIN子句中有多个候选连接列或任何类型的条件逻辑(如CASE语句)时,不要try 连接一次.这会造成性能问题,并限制Oracle可以使用的联接方法.

相反,对每个候选联接列使用联接separately,然后按您希望匹配优先级的顺序使用COALESCE来 Select 所需的维:

SELECT COALESCE(d1.country_id,d2.country_id,d3.country_id) country_id,
       SUM(f.value) value
  FROM country_fact f
       LEFT OUTER JOIN country_dim d1 ON UPPER(f.short_name) = UPPER(d1.country_name)
       LEFT OUTER JOIN country_dim d2 ON UPPER(f.full_name) = UPPER(d2.country_name)
       LEFT OUTER JOIN country_dim d3 ON UPPER(f.alternate_name) = UPPER(d3.country_name)
 GROUP BY COALESCE(d1.country_id,d2.country_id,d3.country_id)
       

然而,您正在进行的聚合表明这是使用一个实际的事实表,而不是获得一个维键来从Stage加载事实表.如果是这样的话,您真的不应该在事实表中包含文本国家/地区字符串.在ETL时,它应该已经被代理country_id替换,因此不需要用户进行这种复杂的查询.

Sql相关问答推荐

如何将varchar传递给tvf并使用该参数来查询结果SQL服务器

如何在SQL查询中只比较日期时间的年份和月份(而忽略日期比较)?

如何实现一个广泛的多级自连接PostgreSQL查询?

当有空单元格时,如何连接列

从列的不同值创建列

retrofit AWS Athena中的JSON

如何根据计数和分组获取订单总数

Access中执行INSERT INTO查询时出现错误消息

重用传递给 node 的参数-postgres upsert查询

从给定数据中查找下一个工作日期

AdventureWorks 查询

SQL 语句将一列中的值与另一列中的不同值相加,同时按第三列进行分组?

在自引用表中使用分组和计数的SQL查询语句

如何使用Informix创建一个临时表,将数据从根表导入并使用筛选条件

如何创建一个递归计数器来查找一个元素有多少父级和子级?

使用SQL中另一个表的查询结果在表中查找记录

Oracle SQL 从多个条件中 Select 但具有相同的 id

为什么 Oracle 在一个查询中对同一张表同时执行 TABLE SCAN 和 INDEX UNIQUE SCAN?

sql count distinct by column 和 sum false 和 true

Select 随机行,使得列子组的组合是唯一的