AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 77589562
Accepted
user23025456
user23025456
Asked: 2023-12-02 15:57:31 +0800 CST2023-12-02 15:57:31 +0800 CST 2023-12-02 15:57:31 +0800 CST

我可以在 FULL OUTER JOIN 期间避免 COALESCE 吗?

  • 772

在比较 2 个表之间的数据的查询中,我经常使用 和 的组合COALESCE来FULL OUTER JOIN显示仅在其中 1 个表中可用的记录。

这可以用更少的语法糖来完成吗?(我的意思并不是替换COALESCE为之NVL类的。)

WITH Dataset1 AS (
    SELECT
        id,
        SUM(amount) AS amount
    FROM
        table1
    GROUP BY
        id
),

Dataset2 AS (
    SELECT
        id,
        SUM(amount) AS amount
    FROM
        table2
    GROUP BY
        id
)

SELECT
    COALESCE(d1.id, d2.id) AS ID,
    COALESCE(d1.amount, 0) AS D1_AMOUNT,
    COALESCE(d2.amount, 0) AS D2_AMOUNT,
    COALESCE(d1.amount, 0) - COALESCE(d2.amount, 0) AS DELTA
FROM
    Dataset1 d1
FULL OUTER JOIN
    Dataset2 d2 c ON
        d2.id = d1.id
WHERE
    ABS(COALESCE(d1.amount, 0) - COALESCE(d2.amount, 0)) >= 5
ORDER BY
    ID
sql
  • 2 2 个回答
  • 61 Views

2 个回答

  • Voted
  1. Best Answer
    Thorsten Kettner
    2023-12-02T20:43:45+08:002023-12-02T20:43:45+08:00

    您编写查询的方式是正确的方式,并且COALESCE对于它正常工作是必要的,因为在完整外连接中任何列都可以为空。

    不过,我会养成一种习惯,以不同于列的方式命名操作结果。在这里,您处理名为 的列amount并将结果命名为amount:

    SUM(amount) AS amount
    

    我宁愿做这个

    SUM(amount) AS total
    

    至于 ID:您可以使用USING而不是ON避免COALESCE在连接的列上使用。USING对于完全外连接查询来说是非常典型的,并且当在同一列上外连接多个表时变得更加方便。

    WITH
      dataset1 AS (SELECT id, SUM(amount) AS total FROM table1 GROUP BY id),
      dataset2 AS (SELECT id, SUM(amount) AS total FROM table2 GROUP BY id)
    SELECT
        id,
        COALESCE(d1.total, 0) AS d1_amount,
        COALESCE(d2.total, 0) AS d2_amount,
        COALESCE(d1.total, 0) - COALESCE(d2.total, 0) AS delta
    FROM dataset1 d1
    FULL OUTER JOIN dataset2 d2 USING (id)
    WHERE ABS(COALESCE(d1.amount, 0) - COALESCE(d2.amount, 0)) >= 5
    ORDER BY id;
    
    • 1
  2. Gesuele Russello
    2023-12-02T20:11:47+08:002023-12-02T20:11:47+08:00

    我不知道这样是否更好。

    WITH DataSet(ID, D1_AMOUNT, D2_AMOUNT, DELTA) AS (
        SELECT ID, SUM(COALESCE(Amount,0)), 0, SUM(COALESCE(Amount,0))
        FROM table1
        GROUP BY ID
        UNION ALL
        SELECT ID, 0, SUM(COALESCE(Amount,0)), SUM(COALESCE(Amount,0))*-1
        FROM table2
        GROUP BY ID
    ),
    DataSet2(ID, D1_AMOUNT, D2_AMOUNT, DELTA) AS (
        SELECT ID,SUM(D1_AMOUNT),SUM(D2_AMOUNT), SUM(DELTA) 
        FROM DataSet 
        GROUP BY ID
    )
    SELECT *
    FROM Dataset2
    WHERE ABS(DELTA)>5
    
    • 0

相关问题

  • 更新除某些列上具有相同值的行之外的所有行

  • 当我返回 sql 列时,有没有办法只反转数字?(希伯来语)

  • 布尔值之间的 SQL less/greater 比较会产生意外结果

  • 如何根据数组中的匹配更新 Postgres 表中的值

  • 如何在sql server中对列求和

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve