使用 case 语句从两个不同的表中选择数据

Posted

技术标签:

【中文标题】使用 case 语句从两个不同的表中选择数据【英文标题】:Selecting data from two different tables with case statement 【发布时间】:2021-12-15 05:15:40 【问题描述】:

我有 2 张桌子。

tab1:

dates.
2021-09-30
2021-10-01
2021-10-02
2021-10-04
2021-11-15

桶:

bucket_dates
2021-10-01.
2021-10-02.
2021-10-03.
2021-11-03.

我想加入这两个表以获得如下所示的最终结果。 (如果有匹配的日期,那么它将匹配,如果没有匹配的日期,那么它应该从 tab1 表中读取下一个最高的日期。例如 2021-10-03 和 2021-11-03 日期。

结果表:

bucket_dates final_dates
2021-10-01. 2021-10-01
2021-10-02. 2021-10-02
2021-10-03. 2021-10-04
2021-11-03. 2021-11-15

我尝试通过使用连接查询来做到这一点

select a.bucket_dates,
   case when b.dates is null then (select min(c.dates) from tab1 c where c.dates > a.bucket_dates)
      else b.dates end as final_dates
from buckets a left join tab1 b 
 on a.bucket_dates = b.dates; 

但此查询给出以下错误 Correlated column is not allowed in a non-equality predicate

任何建议都会很有帮助。

【问题讨论】:

只使用大于或等于的子查询。那么 case 和 join 就不需要了。 @MatBaillie 回答有效.. 但你能给出一些关于我们如何使用子查询来做到这一点的小提示吗? 我最初认为问题与在 case 表达式中使用子查询有关。这可能不适用于 pyspark,但正如我所说,您使您编写的子查询过于复杂。如果你刚刚在子查询中写了>=,那么它本身就会给你答案——至少在其他平台上是这样。 【参考方案1】:

如果 pyspark 不允许在相关子查询中使用 >>=,只需在主查询中使用 MIN()...

SELECT
  b.bucket_dates,
  MIN(t.dates)   AS final_dates
FROM
  buckets   AS b
LEFT JOIN
  tab1      AS t
    ON t.dates >= b.bucket_dates
GROUP BY
  b.bucket_dates

【讨论】:

非常感谢!!这么简单的解决方案,但没想到:)

以上是关于使用 case 语句从两个不同的表中选择数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Raw 语句我可以根据列数据是不是等于另一个表从不同的表中进行选择

SELECT 语句从不同的表中获取所有列

使用 WHERE 或 JOIN 从不同的表中选择?

如何使用 Nhibernate 从连接两个具有所有 id 的表中选择只有一个不同列的多个列是 UNIQUEIDENTIFIER

无法从 SQLPLUS 中的 select 语句创建的表中选择数据

SQL Query 从不同的表中选择相同的数据,显示所有记录,但显示/显示匹配