FULL OUTER JOIN关联多个子查询结果值去重

         以日期GROUP  BY分组查询并作为条件关联3个子查询,子查询分别对应T1/T2/T3,日期是唯一关联条件,一环扣一环,但是如果出现其中某个表没有某一天的数据,而其他表有,比如某一天T1、T3有结果值,但是T2是个空集,链条就断了,就会同一天出现两条数据即重复日期的结果。这时只要在查询结果外面再加一层查询(如红色标记),就能很好的解决FULL OUTER JOIN语句的去重问题了!

SELECT substr(st.sdd,0,8),sum(st.sbks),sum(st.sbs),sum(st.sje),sum(st.sjc)
FROM ( SELECT
        (T1.dd||T2.dd||T3.dd)  sdd, T1.bks sbks, T2.bs sbs, T2.je sje, T3.jc sjc
    FROM (
  SELECT  

            create_date dd, COUNT(*)   bks
            FROM   TBL_TCPAY    WHERE
                create_date >='20180806' AND create_date<='20180816'
            AND status = '12'  GROUP BY create_date    ORDER BY 1) T1
    FULL OUTER JOIN
        ( SELECT
                localdate  dd, COUNT(*)   bs, SUM(amount)/100 je
            FROM   TBL_ATPAY     WHERE        

            localdate >='20180801' AND localdate <='20180905'
            AND status = '0' GROUP BY localdate  ORDER BY 1) T2
    ON T1.dd = T2.dd
    FULL OUTER JOIN
        ( SELECT
                bind_date dd , COUNT(*)  jc
            FROM  TBL_COMPAY    WHERE

            bind_date >='20180806' AND bind_date <='20180816'
            AND comresource='2' GROUP BY bind_date    ORDER BY 1 ) T3
    ON  T2.dd = T3.dd ORDER BY 1 ) st
GROUP BY substr(st.sdd,0,8) ORDER BY 1;

### SQLFULL JOINFULL OUTER JOIN的区别及用法 在SQL中,`FULL JOIN`和`FULL OUTER JOIN`实际上是同一种操作的不同表达方式。两者都用于返回两个表中的所有记录,当左表或右表中没有匹配的记录时,则以NULL填充对应字段[^1]。 #### FULL JOIN/FULL OUTER JOIN 的定义 `FULL JOIN`(或`FULL OUTER JOIN`)会返回左表和右表的所有记录。如果左表或右表中没有找到匹配的记录,则结果集中相应的字段将以NULL填充。这种连接方式可以看作是`LEFT JOIN`和`RIGHT JOIN`的结合体[^2]。 以下是一个示例代码,展示如何使用`FULL JOIN`或`FULL OUTER JOIN`: ```sql SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name; ``` #### 使用场景 - 当需要获取两个表的所有数据,并且希望了解哪些记录在某个表中存在而在另一个表中不存在时,可以使用`FULL JOIN`。 - 在数据分析场景中,例如合并个数据源并检查数据完整性时,`FULL JOIN`非常有用[^3]。 #### 示例说明 假设我们有两张表`TableA`和`TableB`,其内容如下: | TableA | | TableB | |---------|---|----------| | id | name | id | name | | 1 | A | 1 | X | | 2 | B | 2 | Y | | 3 | C | 4 | Z | 执行以下查询: ```sql SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.id = TableB.id; ``` 结果将为: | id | name | id | name | |-----|------|-----|------| | 1 | A | 1 | X | | 2 | B | 2 | Y | | 3 | C | NULL| NULL | | NULL| NULL | 4 | Z | #### FULL JOINFULL OUTER JOIN 的区别 实际上,在大数数据库系统中,`FULL JOIN`和`FULL OUTER JOIN`没有任何区别,它们只是语法上的不同写法。例如,在SQL Server、PostgreSQL等数据库中,两者完全等价[^4]。 然而,在某些特定的数据库实现中,可能会对关键字的使用有一些限制或偏好。例如,某些旧版数据库可能只支持`FULL OUTER JOIN`而不支持`FULL JOIN`。因此,在编写跨平台兼容的SQL时,建议优先使用`FULL OUTER JOIN`以确保兼容性[^2]。 ### 注意事项 - 如果需要过滤出仅存在于一个表中的记录,可以在`FULL OUTER JOIN`的基础上添加`WHERE`条件。例如: ```sql SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.id = TableB.id WHERE TableA.id IS NULL OR TableB.id IS NULL; ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值