如何修改联接以消除联接和(...或者...)条件?

select
table1.id,
table1.country,
table1.city,
table1.platform,
sum(table2.installs) as installs
from 
  schema.table1  
  inner join schema.table2 on table1.id = table2.id 
  and (
    table1.country = table2.country 
    or table1.country is null
  ) 
  and (
    table1.city = table2.utm_source 
    or table1.utm_source is null
  ) 
  and (
    table1.platform = table2.platform  
    or table1.platform is null
  ) 
group by 
table1.id,
table1.country,
table1.city,
table1.platform,

这些条件:OR table1.platform IS NULL

推荐答案

您可以使用coalesce()和ROW类型来缩短查询:

select table1.id, table1.country, table1.city, table1.platform,
       sum(table2.installs) as installs
  from schema.table1  
       join schema.table2 
         on (table1.id, 
             coalesce(table1.country, table2.country),
             coalesce(table1.city, table2.city),
             coalesce(table1.platform, table2.platform)
            ) = (table2.id, table2.country, table2.city, table2.platform)
 group by table1.id, table1.country, table1.city, table1.platform
;

如果要匹配两个表中countrycityplatform为NULL时的条件,请将=更改为is not distinct from.

Sql相关问答推荐

SQL:创建查询以添加减少的总数

如何嵌套两条SQL语句

防止ActiveRecord迁移在db/structure.sql中进行巨大更改

从数据库中查找总和大于或等于查询中的数字的数字

基于多参数的SQL Server条件过滤

了解多个分组集

仅在日期相隔时递增(Oracle SQL)

给定 3 个键列,从一个表中 Select 另一表中不存在的所有数据

如何使用最后一个非 NULL 值在 PostgreSQL 列中填充 NULL 值

如何从三个连接表中获取数据,并始终显示第一个表中的数据,以及第三个表中的空值或现有记录?

我们可以使用连接改进包含多个子查询的查询吗

COBOL\DB2作业(job)需要帮助?快来获取专业指导!

try 将多行折叠为单个结果

使用给定的变量对在循环中执行更新语句

将 MERGE 语句与 Oracle PL/SQL 表类型一起使用时,导致无效数据类型错误的原因是什么?

如何从 2 个 SQLite 表构建嵌套对象?

并非所有变量都绑定在 PL SQL 函数中

将单行中的多个行值转换为列

如何使用子查询锁定此查询中的选定行?

如何刷新在视图之上创建的表