MySQL中應用自界說變量 編寫偷懶的UNION示例。本站提示廣大學習愛好者:(MySQL中應用自界說變量 編寫偷懶的UNION示例)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL中應用自界說變量 編寫偷懶的UNION示例正文
(參考自<<高機能MySQL>>)
假定有如許的需求:寫一個UNION查詢,其第一個子查詢作為分支先履行,假如找到了婚配的行,則不再履行第二個分支的查詢。
普通來講,我們可以寫出如許的UNION查詢:
select id from users where id=123456
union all
select id from users_archived where id = 123456;
此查詢可以正常運轉,然則不管在users表中能否找到記載,都邑到users_archived表中掃描一次;是以能夠也會前往反復的記載。為了削減這類情形下不用要的開支,SQL語句可以寫成如許:
SELECT GREATEST(@found := -1, id) AS id, 'users' AS which_tbl
FROM users WHERE id = 1
UNION ALL
SELECT id, 'users_archived'
FROM users_archived WHERE id = 1 and @found IS NULL
UNION ALL
SELECT 1, 'reset' FROM DUAL WHERE (@found := NULL) IS NOT NLL;
下面的查詢用到了自界說變量@found,經由過程在成果列中做一次賦值而且放在GREATEST函數中,以免前往額定的數據。假如第一個分支查詢成果集為NULL,那@found天然也照樣NULL,是以會履行第二個分支查詢。別的,為了不影響前面的遍歷成果,在查詢的末尾將@found重置為NULL。
別的, 前往的第二列數據是為了解釋這筆記錄是在users表照樣在users_archived表中查詢獲得的。