【发布时间】:2019-04-15 20:54:08
【问题描述】:
我有一个表,其中包含机器销售的品牌、型号、序列号和发票日期,我想将它与包含品牌、序列号、记录使用情况、使用单位和记录日期的表配对 -除了使用/记录表是 HUUUUUUGE 并且可能没有每台机器的记录。
我已尝试编写 OUTER JOIN,但 Usage/Records 表中的数据过多,无法使其高效运行。我试着写一个 CROSS APPLY,但我一定是搞砸了,因为这似乎也不是很有效。
文件示例:
我的基本查询:
Inv. Date Mk Model Serial
2019-03-29 AA 420D 0FDP09999
2019-03-21 AA A19B-SSL 0DX240481
使用/记录表:
Mk Serial Usage Units Record Date
AA 0FDP09999 2345.0 H 2019-03-27
AA 0FDP09999 2349.2 H 2019-03-28
AA 0FDP09999 2351.8 H 2019-03-29
AA 0DX240481 0.0 H 2019-03-21
AA 0DX240481 24.0 H 2019-03-22
输出应该是:
Inv. Date Mk Model Serial Usage Units Record Date
2019-03-29 AA 420D 0FDP09999 2351.8 H 2019-03-29
2019-03-21 AA A19B-SSL 0DX240481 0.0 H 2019-03-21
...仅返回发票日期之前的最新条目的使用、单位和记录日期。
有什么建议吗?
【问题讨论】:
-
请参阅paste the plan,了解在您的问题中包含执行计划的方法。模式和查询也会有所帮助。
-
如何加入表格?在
Serial列上?如果是,那么要让CROSS APPLY(或者更确切地说是OUTER APPLY)有效地工作,您需要一个合适的索引。在您的情况下,它看起来像这样:ON (Serial, RecordDate) INCLUDE (Usage, Units)。INCLUDE部分是可选的,大部分性能都是通过搜索该索引获得的。 -
Last_Value 可能有点用处。
标签: sql-server tsql correlated-subquery