2012-04-03 211 views
1

我寫了一個非常難看的SQL查詢,老實說,我很尷尬地發佈它在這裏......但我需要一些關於4個SELECT語句的幫助。有沒有更好的方式來做到這一點,而不創建該表?SQL查詢 - 需要改進

我不確定巨大的SELECT的內容是否與回答這個問題有關。如果是這樣,我會盡量把這個查詢。 (但是因爲我高度簡化了整個例子,所以可能很難做到)。

任何幫助,非常感謝。

(這個問題是一個跟進到另一個問題,我曾在這裏問:Comparing "Consecutive" Rows in Ms Access

SELECT t2.* FROM 
    (SELECT t.ID, t.SubID, t.Time, t.Value, t.value2, t.value 
    FROM 

( 巨大這裏選擇用3加入)筆

WHERE t.Time=4) AS t2 
      LEFT JOIN 
    (SELECT t.ID, t.SubID, t.Time, t.Value, t.value2, t.value 
    FROM 

( 巨大的SELECT這裏有3個連接)t

WHERE t.Time=3) AS t1 
     ON t2.Id = t1.Id 
     WHERE t2.value<>t1.value 
     OR t2.value2<>t1.value2 
     OR t1.Id Is Null 

UNION ALL

SELECT t1.* FROM 
    (SELECT t.ID, t.SubID, t.Time, t.Value, t.value2, t.value 
    FROM 

( HUGE在這裏選擇用3聯接)噸

 WHERE t.Time=3) AS t1 
      LEFT JOIN 
    (SELECT t.ID, t.SubID, t.Time, t.Value, t.value2, t.value 
    FROM 

( HUGE在這裏選擇用3聯接)噸

WHERE t.Time=4) AS t2 
      ON t1.Id=t2.Id 
      WHERE t1.value<>t2.value 
     OR t1.value2<>t2.value2 
      OR t2.Id Is Null 

ORDER BY標識,EntryNo;

回答

2

它應該能夠簡化這有點像:

SELECT t1.ID, t1.SubID, t1.Time, t1.Value, t1.value2, t1.value FROM 

(HUGE在這裏選擇3個連接)T1

LEFT JOIN 

(HUGE在這裏選擇3個連接)T2

 ON (t2.Id = t1.Id AND t1.Time <> t2.Time and T2.Time in (3,4)) 
    WHERE T1.Time in (3,4) and 
      (t2.value<>t1.value OR t2.value2<>t1.value2 OR t2.Id Is Null) 
+0

感謝您的回答。那麼真的沒有辦法只寫一次「有3個連接的巨大選擇」? – taranaki 2012-04-03 17:22:03

+0

@taranaki :(不知道我以前是怎麼錯過這個評論的。)不是在MS Access中(據我所知) - SQL的其他方言(包括SQLServer)有一些稱爲Common Table Expressions(CTE)的東西,但它們不可用訪問。 – 2012-04-10 10:19:46

+0

嗨,沒問題。很高興你現在看到它:)。那麼,兩個選擇仍然比4更好:)所以非常感謝你的幫助。 – taranaki 2012-04-11 12:50:22