1

次のクエリがあります。

  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 テーブルのコード フィールドに一致する一意の国のセットを返します。速度は1秒未満です。

これを拡張して、クエリが 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

これは機能しますが、パフォーマンスは 1 秒未満から 15 秒になりました。追加したサブクエリ:

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

私が望むものを達成するための最良の方法ではありません。どんな助けでも素晴らしいでしょう。

4

1 に答える 1