为啥在我们已经从内部 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语句中引用?求教,谢谢