我在DB2数据库中的SQL查询有问题。我必须根据第二张表中通过某些字段连接的记录数来从一张表中获取记录。我的查询工作非常非常非常慢。我一直在尝试找到一种更有效的方法,甚至使用内部联接,但仍然是相同的。
SELECT * FROM table1
WHERE
table1.field1 = '9' AND
table1.field2 <= CURRENT DATE - 1 YEAR AND
(
SELECT COUNT(*) FROM table2
WHERE
table2.field1 = '0' AND
table1.field3 = table2.field2 AND
table1.field4 = table2.field3 AND
table1.field5 = table2.field4 AND
table1.field6 = table2.field5 AND
table1.field7 = table2.field6
) = 0
WITH UR
答案 0 :(得分:1)
我会尝试的第一次尝试:
SELECT * FROM table1
WHERE
table1.field1 = '9' AND
table1.field2 <= CURRENT DATE - 1 YEAR AND
NOT EXISTS
(
SELECT 1 FROM table2
WHERE
table2.field1 = '0' AND
table1.field3 = table2.field2 AND
table1.field4 = table2.field3 AND
table1.field5 = table2.field4 AND
table1.field6 = table2.field5 AND
table1.field7 = table2.field6
)
WITH UR
尽管没有模式,数据和执行计划也无法进行预测
答案 1 :(得分:1)
我认为这可能更好。首先,将查询更改为使用NOT EXISTS
:
SELECT *
FROM table1
WHERE table1.field1 = '9' AND -- do not use single quotes if field1 is a number!
table1.field2 <= CURRENT DATE - 1 YEAR AND
NOT EXISTS (SELECT 1
FROM table2
WHERE table2.field1 = '0' AND
table1.field3 = table2.field2 AND
table1.field4 = table2.field3 AND
table1.field5 = table2.field4 AND
table1.field6 = table2.field5 AND
table1.field7 = table2.field6
) ;
第二,确保比较使用正确的类型'9'
或9
? '0'
还是0
?
第三,添加索引:
table1(field1, field2)
table2(field2, field3, field4, field5, field6, field1)
table2
索引的前五个字段的顺序是任意的;但是,field1
应该紧随其后。