用于部分重叠数据的 Sql Join

Posted

技术标签:

【中文标题】用于部分重叠数据的 Sql Join【英文标题】:Sql Join for partly overlapping data 【发布时间】:2012-02-27 11:31:51 【问题描述】:

我从 3 个表(日期和数量)中检索数据,一些数据可能重叠,但不确定哪些表。例如,有些日子可能会重叠 表 t1 和 t2 但不在 t3 中, 或 t2 和 t3 但不在 t1 或 t1 和 t3 但不在 t2 中

如果我执行完全联接,我最终会得到很多空值和三个不同的日期列。

如何获取要格式化的数据: date,qty1, qty2, gty3 其中[date] 将包含所有天表 3 表? 零将替换所有空值

07/02/2012  ||   2   ||  0  ||  7 


CREATE TABLE t1 (
    [date] [nvarchar](10) 
    ,qtyt1 [int]
) 

CREATE TABLE t2 (
    [date] [nvarchar](10) 
    ,qtyt2 [int]
) 

CREATE TABLE t3 (
    [date] [nvarchar](10) 
    ,qtyt3 [int]
) 


insert into t1 values ('05/02/2012', 2)
insert into t1 values ('07/02/2012', 3)
insert into t2 values ('06/02/2012', 4)
insert into t2 values ('08/02/2012', 5)
insert into t3 values ('07/02/2012', 7)
insert into t3 values ('08/02/2012', 11)


select * from t1
full join t2 on t1.date = t2.date 
full join t3 on t2.date = t3.date

【问题讨论】:

【参考方案1】:
SELECT COALESCE(t1.date, t2.date, t3.date) AS date,
       qtyt1,
       qtyt2,
       qtyt3
FROM   t1
       FULL JOIN t2
         ON t1.date = t2.date
       FULL JOIN t3
         ON ISNULL(t2.date, t1.date) = t3.date  

【讨论】:

@ErikE - 是的。我默认为ISNULL,除非超过2个参数或其他原因更喜欢COALESCE @MartinSmith:将第一行更改为SELECT ISNULL(ISNULL(t1.date, t2.date), t3.date) 会更好吗? @ypercube - 不是 IMO。 It would if the expressions were sub queries rather than column references though. 我总是默认使用 Coalesce,因为它改进了类型转换。

以上是关于用于部分重叠数据的 Sql Join的主要内容,如果未能解决你的问题,请参考以下文章

用于查找重叠客户的 SQL 子查询

SQL 重叠和多列索引

如何在Hive / Spark SQL中使用窗口功能删除重叠部分

如何在 SQL 中选择重叠的日期范围

检查时间范围重叠,守望者问题 [SQL]

Oracle SQL 选择具有开始和结束日期的行,如果某些重叠合并行