需要指导以简化此查询

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

【讨论】:

以上是关于需要指导以简化此查询的主要内容,如果未能解决你的问题,请参考以下文章

我如何优化此查询以用于计算响应的 sql

需要有关在 Windows 中重新编写此批处理脚本以消除文件名中我想要的字符的指导

MYSQL - 存储过程查询简化

简化查询以用作 winform rdlc 报告中的数据集

需要哪些组件以及如何传输此查询以在 ODI 中使用?

简化现有的Hibernate查询语言(HQL)