为啥在我们已经从内部 SELECT 中找到数据之后调用 JOIN?

Posted

技术标签:

【中文标题】为啥在我们已经从内部 SELECT 中找到数据之后调用 JOIN?【英文标题】:Why calling JOIN after we already found data from inner SELECT?为什么在我们已经从内部 SELECT 中找到数据之后调用 JOIN? 【发布时间】:2016-01-17 23:45:21 【问题描述】:

在下面的 SQL 语句中,为什么我们必须在 total_sellers_month 上使用最后一个 JOIN?

SELECT 
    best.*
FROM
    (SELECT 
        rm.rc_year,
        rm.rc_month,
        (SELECT vm.vd_id 
            FROM total_sellers_month vm 
            WHERE vm.rc_year = rm.rc_year AND vm.rc_month = rm.rc_month 
            ORDER BY rc_total DESC LIMIT 1
        ) AS vd_id
        FROM total_months rm
    ) AS best
    JOIN sellers v ON (v.vd_id = best.vd_id)
    JOIN total_sellers_month rm 
        ON (rm.vd_id = best.vd_id AND rm.rc_year = best.rc_year AND rm.rc_month = best.rc_month )
ORDER BY rc_year, rc_month;

我们有第二个 SELECT,它已经根据最佳月份/年份为我们提供了年、月和 id:

    (SELECT 
        rm.rc_year,
        rm.rc_month,
        (SELECT vm.vd_id 
            FROM total_sellers_month vm 
            WHERE vm.rc_year = rm.rc_year AND vm.rc_month = rm.rc_month 
            ORDER BY rc_total DESC LIMIT 1
        ) AS vd_id
        FROM total_months rm
    ) AS best

然后我们添加卖家以获得更多信息(每个卖家的名称等),然后我们重复调用 total_sellers_month 并加入:

JOIN total_sellers_month rm 
        ON (rm.vd_id = best.vd_id AND rm.rc_year = best.rc_year AND 

我们为什么不对“卖家”使用 JOIN?我们从内部 SELECT 中检索到的数据不足以被识别为用于联接的表?

【问题讨论】:

该查询是否针对此问题进行了修改?特别是best.*:这真的是输出列的唯一来源吗? 【参考方案1】:

据我所知,您只能从 best 加入到 total_sellers_month 以获取您没有从派生表中收集的列。这可能是一种有效的技术,其中best 只是定位所需行的方法,但随后必须连接回源表才能访问这些完整的源行。

但是,由于您在问题中仅显示“选择最佳。*”,因此任何连接都没有目的。也许这可能是由于问题的简化。

【讨论】:

是的,我为这个问题简化了它。那么,best 不是我们想要的结果的表吗?编辑:好的,我想我明白你的意思,我们想要整行,但是整行已经是“id、year、month”,所以我们不会在 JOIN 中添加更多信息。 如果您需要最顶层选择列表中的 total_sellers_month 列,而 best 子查询中不存在,那么,是的,您需要该连接。

以上是关于为啥在我们已经从内部 SELECT 中找到数据之后调用 JOIN?的主要内容,如果未能解决你的问题,请参考以下文章

在Oracle中定义SQL查询。索引为啥不能直接从select语句中引用?求教,谢谢

为啥eclipse中不能选择tomcat服务器

为啥我们要合并几个select语句

Cocoapod:为啥 Xcode 构建过程试图找到已经从我的项目中删除的库

为啥我从网上下载的东西,解压后里面的文档都成乱码了?

在oracle中创建db link 已经确定创建成功了。在创建视图时为啥还会报不能找到db link呢?