根据输入参数使用内连接或外连接 - 不使用动态 sql

Posted

技术标签:

【中文标题】根据输入参数使用内连接或外连接 - 不使用动态 sql【英文标题】:Using inner or outer join based on input parameter - without using dynamic sql 【发布时间】:2021-12-01 12:15:32 【问题描述】:

不使用动态sql,是否可以根据参数的值来条件连接到外部或内部?

我的意思是,如果给定一个参数(过滤器值),那么查询必须 返回完全匹配的记录(或 0 条记录) - 充当 inner join 如果未提供此过滤器,则需要返回所有 记录 - 充当外部联接

【问题讨论】:

也许吧。取决于过滤器适用于哪个表。如果您的查询是外连接,但您将谓词应用于要外连接的表,则有效地将查询转换为内连接。然而,同样的事情不适用于驾驶台。 情况是条件适用于外联表,那么我们如何通过一个不存在的值对该表进行过滤时得到0条记录呢? 【参考方案1】:

如果过滤器在您要外部加入的表上

select some_columns
  from left l
       left outer join right r
         on( l.right_id = r.right_id )
 where r.filter_column = p_some_parameter
    or p_some_parameter is null

似乎就是您所需要的。如果指定了p_some_parameter,则谓词有效地将outer join 转换为inner join。如果未指定p_some_parameter,则查询仍为outer join

【讨论】:

以上是关于根据输入参数使用内连接或外连接 - 不使用动态 sql的主要内容,如果未能解决你的问题,请参考以下文章

如何制作动态层分组报表

Java Persistence:根据运行时参数连接不同的列

ESN简介

带有选项的光滑左/右/外连接

Hive sql中的 各种join(内连接左外连接右外连接满外连接)

Hive sql中的 各种join(内连接左外连接右外连接满外连接)