2013-07-05 45 views
1

我有以下查詢:sqlite的查詢來獲取最早日期

SELECT (CASE WHEN cc.id IS NULL THEN dc.id ELSE cc.id END) AS id, 
l.CALL,l.QSO_DATE,cc.prefix,l.state,l.QSL_RCVD,l.Band,l.Mode, 
(CASE WHEN CC.Country IS NULL THEN dc.Country ELSE cc.Country END) AS country, 
(CASE WHEN CC.Country IS NULL THEN 'Y' ELSE 'N' END) AS 'deleted', 
(CASE WHEN CC.flags IS NULL THEN dc.flags ELSE cc.flags END) AS 'flag' 
FROM lotw l 
LEFT OUTER JOIN CountryCode AS cc on cc.code = l.dxcc 
LEFT OUTER JOIN DeleteCountry AS dc on dc.code = l.dxcc 
WHERE l.DXCC > '' 

GROUP BY CC.Country,dc.Country ORDER BY cc.COUNTRY,dc.COUNTRY. 

返回一組唯一的國家的COUNTRYCODE表的代碼字段相匹配。 速度不到一秒鐘。

我需要展開這個查詢select從LOTW表中選擇最早的QSLRDATE。 所以我修改本查詢:

SELECT (CASE WHEN cc.id IS NULL THEN dc.id ELSE cc.id END) AS id, l.CALL,l.QSO_DATE,cc.prefix,l.state,l.QSL_RCVD,l.Band,l.Mode, 
(CASE WHEN CC.Country IS NULL THEN dc.Country ELSE cc.Country END) AS country, 
(CASE WHEN CC.Country IS NULL THEN 'Y' ELSE 'N' END) AS 'deleted', 
(CASE WHEN CC.flags IS NULL THEN dc.flags ELSE cc.flags END) AS 'flag' 
FROM lotw l 
LEFT OUTER JOIN CountryCode AS cc on cc.code = l.dxcc 
LEFT OUTER JOIN DeleteCountry AS dc on dc.code = l.dxcc 
WHERE l.QSLRDATE = (SELECT MIN(l2.QSLRDATE) FROM LOTW l2 WHERE l2.DXCC=l.DXCC) AND l.DXCC > '' 

GROUP BY CC.Country,dc.Country ORDER BY cc.COUNTRY,dc.COUNTRY 

這個工作,但是性能從不到一秒到15秒去。 子查詢我說:

l.QSLRDATE = (SELECT MIN(l2.QSLRDATE) FROM LOTW l2 WHERE l2.DXCC=l.DXCC) 

不能完成我想要的東西的最佳方式。 任何幫助將是偉大的。

回答

0

嘗試加入子查詢而不是在WHERE子句中使用相關子查詢。

SELECT 
    (CASE WHEN cc.id IS NULL THEN dc.id ELSE cc.id END) AS id, 
    l.CALL,l.QSO_DATE,cc.prefix,l.state,l.QSL_RCVD,l.Band,l.Mode, 
    (CASE WHEN CC.Country IS NULL THEN dc.Country ELSE cc.Country END) AS country, 
    (CASE WHEN CC.Country IS NULL THEN 'Y' ELSE 'N' END) AS 'deleted', 
    (CASE WHEN CC.flags IS NULL THEN dc.flags ELSE cc.flags END) AS 'flag' 
FROM 
    (SELECT dxcc, MIN(qslrdate) AS qslrdate FROM lotw GROUP BY dxcc) AS qslr 
    INNER JOIN lotw AS l ON l.dxcc = qslr.dxcc AND l.qslrdate = qslr.qslrdate 
LEFT OUTER JOIN CountryCode AS cc on cc.code = l.dxcc 
LEFT OUTER JOIN DeleteCountry AS dc on dc.code = l.dxcc 
WHERE l.DXCC > '' 
GROUP BY CC.Country,dc.Country ORDER BY cc.COUNTRY,dc.COUNTRY 

同時,確保lotw(dxcc, qslrdate)的索引可以使保證雙方的子查詢和聯接表現良好。

事實上,確保您先找到該索引,然後重試您的查詢。然後,如果性能仍然很差,請嘗試上述查詢。

+0

非常酷的索引和你的代碼實際上比以前更快非常感謝,我從來沒有想過加入 – Mike