(參考自<<高性能MySQL>>)
假設有這樣的需求:寫一個UNION查詢,其第一個子查詢作為分支先執行,如果找到了匹配的行,則不再執行第二個分支的查詢。
一般來說,我們可以寫出這樣的UNION查詢:
此查詢可以正常運行,但是無論在users表中是否找到記錄,都會到users_archived表中掃描一次;因此可能也會返回重復的記錄。為了減少這種情況下不必要的開銷,SQL語句可以寫成這樣:
上 面的查詢用到了自定義變量@found,通過在結果列中做一次賦值並且放在GREATEST函數中,以避免返回額外的數據。如果第一個分支查詢結果集為 NULL,那@found自然也還是NULL,因此會執行第二個分支查詢。另外,為了不影響後面的遍歷結果,在查詢的末尾將@found重置為NULL。
另外, 返回的第二列數據是為了說明這條記錄是在users表還是在users_archived表中查詢得到的。