2011-12-02 49 views
2

這裏是我當前的查詢:在查詢中出現太多問題,或者這是猶太教嗎?

SELECT * FROM (
    SELECT * FROM feesbydate 
    LEFT JOIN (
     SELECT MAX(from_date) as the_date FROM (
      SELECT a.* FROM feesbydate a, feesbydate b 
      WHERE a.exchFee_ID = 15 AND b.exchFee_ID = 15 
        AND a.from_date <= b.from_date 
        AND a.id <> b.id AND b.id = 62 
      GROUP BY a.id 
     ) a) b on from_date < the_date 
    WHERE exchFee_ID = 15) c 
WHERE not(isnull(the_date)); 

基本上我有具有以下的表:

ID | exch_feeID | from_date | to_date |其他不相關的列

我希望得到的是有一個from_date之前一定id(在上面62的例子),並與所有的記錄一定exchFee_ID(在上面15的例子)。

上面的查詢工作。但隨着桌子的增長,這可能不是最理想的。有沒有更高效或高效的方法來做到這一點?

回答

3

只是做一個簡單的JOIN:

SELECT * 
    FROM feesbydate AS f, 
     (SELECT from_date 
      FROM feesbydate 
      WHERE id = 62 
      AND exchFee_ID = 15) AS g 
WHERE f.exchFee_ID = 15 
    AND f.from_date < g.from_date 

只要你能保證每一個記錄都有from_date這應該足矣下保存的值。

+0

您的查詢有一個額外的記錄,我的**沒有**,爲什麼? – Neal

+0

哪一個會是?請發佈其記錄集。 – aefxx

+0

哦,我明白了。在你最內層的JOIN中,你選擇了具有'62'以外的'id'的行的最大'from_date'。然後在外部範圍中,您明確地使用'... b on_date aefxx

-2

只要你的鍵和索引是理智的,這很好。 SQL是對於這樣的複雜性。不要害怕使用它。

但是,如果您懷疑性能問題,請在優化之前先對其進行基準測試。

+3

-1 | 「SQL是爲了像這樣的複雜性」。我不是故意冒犯,但這是無稽之談。 – aefxx