sql - 引用父别名时将外部应用转换为左连接
问题描述
我目前正在尝试将外部应用转换为左连接以节省一些复杂性。
SELECT *
FROM fact_table h
OUTER APPLY (SELECT TOP 1
*
FROM dimension mcc WITH (NOLOCK)
WHERE h.product = mcc.product
AND h.country = mcc.country
AND mcc.date IN (SELECT MAX(date)
FROM dimension dd WITH (NOLOCK)
WHERE FORMAT(DATEADD(MONTH, -3, dd.date), 'yyyyMM') <= h.month_in_the_year
AND dd.product = h.product
AND dd.country = h.country)) a;
我基本上用它来从 Dimension 中获取相关数据,这些数据与 3 个月前的最新数据点相关联。
我试图把它变成一个左连接,但它需要更多的时间,因为我没有在连接之前过滤维度:
SELECT TOP 10
*
FROM fact_table h
LEFT JOIN dimension a ON h.product = a.product
AND h.country = a.country
AND a.pkid = (SELECT TOP 1
pkid
FROM dimension dd
WHERE FORMAT(DATEADD(MONTH, -3, dd.date), 'yyyyMM') <= h.month_in_the_year
ORDER BY date DESC);
您是否知道如何有效地将其转换为左连接?
解决方案
看起来您可以通过简单地添加一个ORDER BY
. 我还修改了日期过滤器以正确利用索引。
SELECT *
FROM fact_table h
OUTER APPLY (
SELECT TOP 1 *
FROM dimension mcc
WHERE h.product = mcc.product
AND h.country = mcc.country
AND mcc.date < DATEADD(MONTH, 2, DATEFROMPARTS(LEFT(h.month_in_the_year, 4), RIGHT(h.month_in_the_year, 2), 1))
ORDER BY mcc.date DESC
) a;
要将其转换为LEFT JOIN
,您需要利用行编号
SELECT *
FROM (
SELECT *,
rn = ROW_NUMBER() OVER (PARTITION BY h.PrimaryKeyColumn ORDER BY mcc.date)
FROM fact_table h
LEFT JOIN dimension mcc
ON h.product = mcc.product
AND h.country = mcc.country
AND mcc.date < DATEADD(MONTH, 2, DATEFROMPARTS(LEFT(h.month_in_the_year, 4), RIGHT(h.month_in_the_year, 2), 1))
) a
WHERE rn = 1;
推荐阅读
- awk - awk 函数的输出不正确
- c++ - 在终端中为 ncurses 启用鼠标事件
- google-chrome - 如何限制 Chromium GPU 进程系统内存使用量?
- azure - Azure 自动化 - 无法停止 Azure Function App
- python - 使用 requests.get 后,我无法 g
- javascript - 提高在浏览器控制台中运行的 js 机器人的执行速度的方法
- python - Django AttributeError:导入表单类
- html - 如果我选中了所有兄弟复选框,父复选框将自动选中
- node.js - Meteor Docker Node.js 版本不匹配
- android - 在java类中获取活动结果