2016-02-05 103 views
0

我不太瞭解SQL,因此希望我的查詢可以根據您的知識進行改進。事實是我的電腦無法處理這個查詢,所以我想知道是否有更好的方法來做到這一點。SQL子查詢優化訪問

我的查詢是:

SELECT 
    v.*, 
    IIF((SELECT COUNT(v2.pk) FROM demo v2 
     WHERE v.place = v2.place 
      AND v.date = v2.date) > 1, "Si", "No") 
FROM demo AS v; 

關鍵是要標誌,具有相同place和相同date另一個記錄的記錄。

+2

也許你可以詳細說明你的PC如何處理查詢。你的意思是使用iif(而不是如果)?有趣的是將「Si」或「No」寫成布爾值,但不知道你可以改變這種語法。 – MathBio

+0

只有一個條款重要嗎? 「Si」和「No」是退回的值,所以我不知道你的意思是什麼...無論如何,我刪除了如果只是使用計數退回的值,它仍然太難執行... 問題是不是我的電腦硬件,也許acces不能處理這個,但我不能改變它:( 你認爲有更好的方式來構建查詢? – Mituga

+1

「演示」有多少記錄? - 你有沒有嘗試過查詢嚮導在Access中查找重複? – Andre

回答

1

開始用GROUP BY查詢,讓你爲placedate每個組合的個性化......

SELECT v2.place, v2.date, COUNT(*) AS group_count 
FROM demo AS v2 
GROUP BY v2.place, v2.date 

然後你可以使用它作爲你加入回demo表的子查詢和您IIf表達添加到頂級SELECT條款等

SELECT 
    v.*, IIf(sub.group_count > 1, 'Si', 'No') 
FROM 
    demo AS v 
    INNER JOIN 
    (
     SELECT v2.place, v2.date, COUNT(*) AS group_count 
     FROM demo AS v2 
     GROUP BY v2.place, v2.date 
    ) AS sub 
    ON v.place = sub.place AND v.date = sub.date; 

關於業績,Y ou應該索引placedate字段。如果demo表非常龐大,那麼這個查詢可能不會很快,但它應該比您的原始版本更快。

我建議你也用你想看的字段列表替換v.*v.*需要2個步驟:首先找到對應於v.*的字段名;其次,檢索這些字段的數據。因此列出字段名稱消除了第一步。如果您只需要查看可用字段的一部分,按名稱列出它們意味着數據庫引擎檢索的數據較少。

+0

嗨,非常感謝!它比我的工作正確和快捷,但有一個問題。演示表有45000條記錄和查詢表只有35000 ....爲了解決它,我將INNER JOIN更改爲LEFT JOIN,它似乎工作,但我不知道在某些情況下它是否會影響不正確的結果。 – Mituga

+0

你是說它不適合'INNER JOIN'嗎? – HansUp

+0

是的,INNER JOIN有些記錄丟失了......也許有些地方和日期的垃圾記錄爲空或類似的東西。可能是數據庫問題,而不是查詢問題。萬分感謝!! – Mituga