【发布时间】:2015-10-28 12:28:11
【问题描述】:
我有一个包含计算字段的查询,其中涉及在 CTE 中为每个字段查找数据集,但是当我找到其中几个字段时,速度很慢。
这是一个想法:
;WITH TRNCTE AS
(
SELECT TRN.PORT_N, TRN.TRADE_DATE, TRN.TRANS_TYPE, TRN.TRANS_SUB_CODE, TRN.SEC_TYPE, TRN.SETTLE_DATE
FROM TRNS_RPT TRN
WHERE TRN.TRADEDT >= '2014-01-01' AND TRN.TRADEDT <= '2014-12-31'
)
SELECT
C.CLIENT_NAME,
C.PORT_N,
C.PHONE_NUMBER,
CASE
WHEN EXISTS(SELECT TOP 1 1 FROM TRNCTE WHERE PORT_N = C.PORT_N AND MONTH(SETTLE_DATE) = 12) THEN 'DECEMBER TRANSACTION'
ELSE 'NOT DECEMBER TRANSACTION'
END AS ALIAS1
FROM CLIENTS C
WHERE EXISTS(SELECT TOP 1 1 FROM TRNCTE WHERE PORT_N = C.PORT_N)
如果我有许多这样的计算字段,则执行查询最多可能需要 10 分钟。在 CTE 中收集大约 1,000,000 条记录的数据大约需要 15 秒。
我真的不需要 JOIN,因为我并没有真正使用 JOIN 会执行的数据,我只想检查 TRNS_RPT 中是否存在具有某些条件的记录,并将别名字段设置为某些值我是否找到这样的记录与否。
你能帮我优化一下吗?谢谢
【问题讨论】:
-
你的意图是什么?你想看看在 12 月有交易的客户吗?
-
CTE 将对主查询中的每个引用“执行”一次。结果不会被缓存和重用。
-
@PeterRing 否。意图就是如图所示。如果我有一个交易符合某个客户的某些条件,那么某些标志(别名)将具有不同的值。
标签: sql sql-server-2005 common-table-expression