sql - 优化 SELECT 查询以处理大型数据库
问题描述
这是我的数据库的一部分:
ID EmployeeID Status EffectiveDate
1 110545 Active 2011-08-01
2 110700 Active 2012-01-05
3 110060 Active 2012-01-05
4 110222 Active 2012-06-30
5 110545 Resigned 2012-07-01
6 110545 Active 2013-02-12
我想生成选择活跃员工的记录:
ID EmployeeID Status EffectiveDate
2 110700 Active 2012-01-05
3 110060 Active 2012-01-05
4 110222 Active 2012-06-30
所以,我尝试了这个查询:
SELECT *
FROM Employee AS E
WHERE E.Status='Active' AND
E.EffectiveDate between'2011-08-01' and '2012-07-02'AND NOT
EXISTS(SELECT * FROM Employee AS E2
WHERE E2.EmployeeID = E.EmployeeID AND E2.Status = 'Resigned'
AND E2.EffectiveDate between '2011-08-01' and '2012-07-02'
);
它仅适用于少量数据,但在大型数据库中出现超时错误。
你能帮我优化一下吗?
解决方案
我尝试使用案例语句来实现上述结果集。希望这可以帮助。
CREATE TABLE employee_test
(rec NUMBER,
employee_id NUMBER,
status VARCHAR2(100),
effectivedate DATE);
INSERT INTO employee_test VALUES(1,110545,'Active',TO_DATE('01-08-2011','DD-MM-YYYY'));
INSERT INTO employee_test VALUES(2,110545,'Active',TO_DATE('05-01-2012','DD-MM-YYYY'));
INSERT INTO employee_test VALUES(3,110545,'Active',TO_DATE('05-01-2012','DD-MM-YYYY'));
INSERT INTO employee_test VALUES(4,110545,'Active',TO_DATE('30-06-2012','DD-MM-YYYY'));
INSERT INTO employee_test VALUES(5,110545,'Resigned',TO_DATE('01-07-2012','DD-MM-YYYY'));
INSERT INTO employee_test VALUES(6,110545,'Active',TO_DATE('12-02-2013','DD-MM-YYYY'));
COMMIT;
SELECT * FROM(
SELECT e.* ,
CASE WHEN (effectivedate BETWEEN TO_DATE('2011-08-01','YYYY-MM-DD') AND TO_DATE('2012-07-02','YYYY-MM-DD') AND status='Active')
THEN 'Y' ELSE 'N' END AS FLAG
FROM Employee_Test e)
WHERE Flag='Y'
;
推荐阅读
- reactjs - react-bootstrap-table2 如何在一列中使用多个数据字段
- python - discord.py 中的 cogs 会减慢你的机器人速度吗?
- c++ - 本征矩阵什么时候释放堆内存?
- r - R:textrank_sentences 中的错误(数据 = article_sentences,术语 = article_words):nrow(数据)> 1 不是 TRUE
- css - 如何使用样式组件从主题添加多个 css 属性
- php - 在 Google 表格中更新单元格字体时保持边框
- arrays - ForEach 循环中的 SwiftUI 崩溃
- javascript - 在javascript中将数组转换为对象
- php - 表中 php/mysql 结果的限制(可能很容易)
- c - 结构指针的 C 类型转换