在任何情况下,我不会喜欢相关的子查询。从我看到这是INFORMIX而不是SQL的意见,因此我会建议使用JOIN与嵌套选择作为第一首选项。这样做的好处是这些都是非常原生的编写查询方式,您可以期望数据库优化器使用索引(如果可用)提出良好的执行计划。 SQL中的 如果我的表不在百万行中,我会去CTE。我假设你有适当的表格索引。如果不确定你在表格上有以下索引。
注意索引中列的顺序及其ASC/DESC顺序。
CREATE CLUSTER INDEX IDXc_alt6sal
ON alt6sal ( meg_code ASC,
sal_year DESC,
sal_mon DESC,
emp_num ASC
)
CREATE INDEX IDXnc_alt6sal
ON alt6sal ( meg_code ASC,
sal_year DESC,
sal_mon DESC,
emp_num ASC
) INCLUDE (meg,currency)
现在测试下面的查询。请注意,当我使用实际表格时,我在所有选择中都添加了“meg_code IN(1,2)”条件。即使在嵌套的select语句中,也允许查询减少结果集中所需的行数。还会注意到Where和JOIN条件中的查询中提及的列与索引中的列顺序匹配。
一件事我留给你的是尝试
“meg_cod = 1或meg_cod = 2”
,而不是
“meg_code IN(1,2)”
并查看性能是否为明显提高。我知道如果它是SQL它不会有任何区别,但对于INFORMIX我不是100%确定。
SELECT t1.meg,t1.currency,t1.emp_num
FROM alt6sal t1
JOIN
(
Select yer.emp_num,yer.sal_year,MAX(mth.sal_mon) AS sal_mon
FROM
(SELECT emp_num, MAX(sal_year) AS sal_year
FROM alt6sal
WHERE meg_code IN (1, 2)
GROUP BY emp_num
)yer
JOIN alt6sal mth
ON yer.sal_year = mth.sal_year AND yer.emp_num=mth.emp_num
AND mth.meg_code IN (1,2)
GROUP BY yer.sal_year,yer.emp_num
)t2
ON t1.sal_year=t2.sal_year AND t1.sal_mon=t2.sal_mon AND t1.emp_num=t2.emp_num
AND t1.meg_code IN (1,2)
'a.sal_year>(SELECT MAX(ia.sal_year)'甚至不应该提供一个结果 – bummi
@bummi:抱歉'a.sal_year =(SELECT MAX(ia.sal_year)' –
这是SQL SERVER或INFORMIX?你可以同时标记 – ceinmart