需要指导以简化此查询
Posted
技术标签:
【中文标题】需要指导以简化此查询【英文标题】:Need guidance to simplify this query 【发布时间】:2019-04-11 07:43:43 【问题描述】:我们有一个包含许多条件的庞大查询。
但是,我们觉得有些条件是无关紧要的
请告诉我这里的where
子句是否可以删除
请在下面找到带有where
子句的巨大查询(子查询)的摘录
SELECT f1, ... f10
FROM A
JOIN
SELECT f1, f2 ... f10
FROM B where PROC_DT IN (SELECT PROC_DATE FROM C)
ON A.ID = B.ID
WHERE ISNOTNULL(PROC_DT)
我认为查询在从表 B 中获取数据时已经验证了 PROC_DATE。所以我们可以在此处删除 where
子句吗?
谁能证实我的发现
【问题讨论】:
我认为查询已经验证了从表 B 获取数据的 PROC_DATE 怎么会有人知道呢?您是有权访问实际数据的人。 @forpas 当然可以——它不能为空,因为PROC_DT IN (SELECT PROC_DATE FROM C)
@Hogan 这里有 2 个 where 子句。你指的是哪个,OP指的是哪个?哪些地方可以去掉,哪些地方不能去掉?
@forpas where is not null 声明——这暗示了他所说的(在前面的句子中)它已经验证了,因为它正在从 b 获取数据。
【参考方案1】:
是的,你是正确的,因为 in 它不能为空。我会改用内部连接,在某些情况下它会更快。
SELECT f1, ... f10
FROM A
JOIN B ON A.ID = B.ID
join (SELECT DISTINCT PROC_DATE FROM C) AS X ON B.PROC_DT = X.PROC_DATE
【讨论】:
以上是关于需要指导以简化此查询的主要内容,如果未能解决你的问题,请参考以下文章