【问题标题】:Optimal way to fill in missing values after a LEFT JOIN?左连接后填充缺失值的最佳方法?
【发布时间】:2023-03-17 14:21:01
【问题描述】:

我将简化我的问题以明确核心问题:我有一个查询是 TableA INNER JOIN TableB LEFT JOIN TableC

左连接的结果是,在结果集中,其中两列在某些行中可能有 NULL 值。要填写缺失值,我必须遍历结果集并查询另一个包含数据的数据库(因此无法加入 首先)。

我的问题是:当我们需要在左连接后填充结果集的空值时,是否有标准/优化的方法?

【问题讨论】:

    标签: mysql sql performance join data-structures


    【解决方案1】:

    “要填充缺失值,我必须遍历结果集并查询另一个包含数据的数据库(因此首先无法加入)。”

    考虑不同的解决方案,然后循环填充数据。

    1.同一服务器上的另一个数据库==容易。只需使用 db.schema 限定名加入即可。

    1. 另一个服务器上的另一个数据库,仍然可能取决于您的网络拓扑。然后使用 server.db.schema 限定名加入。

    2. 如果您经常需要这样做,请考虑复制您需要的数据。

    【讨论】:

    • 我可以在不同的机器上连接来自不同数据库的表吗?
    • 是的。如果它们已链接,您可以跨服务器加入。 technet.microsoft.com/en-us/library/ms188279.aspx
    • 我使用的不是MS-SQL,而是MySQL
    • 吉姆。抱歉,我看错了,尤其是在看到上面 user3426870 的评论之后。 MySQL 的 FEDERATED 引擎提供了类似的功能。 stackoverflow.com/questions/5370970/…
    • 我正在使用 InnoDb。感谢您提及这一点。我不知道这个
    【解决方案2】:

    您可以改用COALESCE(...) (MSDN - COALESCE)。

    您的查询将如下所示:

    select a, b, COALESCE(TableB.c, 'replacement value')
    from TableA INNER JOIN TableB LEFT JOIN TableC ...
    

    为您的替换表添加另一个联接,并将您要替换的列 NULL 值放在您不想使用静态值的 COALESCE 函数中。

    【讨论】:

    • 但我没有替换值。我需要填写它,但要做到这一点,我会遍历结果集并查询另一个数据库
    • 您可以创建链接服务器以在查询中加入您的外部数据库(如果数据库在同一服务器上:otherDB.Schema.Table)。
    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 2019-11-18
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    相关资源
    最近更新 更多