国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL中使用自定義變量 編寫偷懶的UNION示例

2020-01-18 23:33:07
字體:
供稿:網(wǎng)友

(參考自<<高性能MySQL>>)
假設(shè)有這樣的需求:寫一個(gè)UNION查詢,其第一個(gè)子查詢作為分支先執(zhí)行,如果找到了匹配的行,則不再執(zhí)行第二個(gè)分支的查詢。

一般來說,我們可以寫出這樣的UNION查詢:

復(fù)制代碼 代碼如下:

select id from users where id=123456
union all
select id from users_archived where id = 123456;

此查詢可以正常運(yùn)行,但是無論在users表中是否找到記錄,都會(huì)到users_archived表中掃描一次;因此可能也會(huì)返回重復(fù)的記錄。為了減少這種情況下不必要的開銷,SQL語句可以寫成這樣:
復(fù)制代碼 代碼如下:

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,通過在結(jié)果列中做一次賦值并且放在GREATEST函數(shù)中,以避免返回額外的數(shù)據(jù)。如果第一個(gè)分支查詢結(jié)果集為NULL,那@found自然也還是NULL,因此會(huì)執(zhí)行第二個(gè)分支查詢。另外,為了不影響后面的遍歷結(jié)果,在查詢的末尾將@found重置為NULL。

另外, 返回的第二列數(shù)據(jù)是為了說明這條記錄是在users表還是在users_archived表中查詢得到的。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 鹿泉市| 盐亭县| 蓬莱市| 房产| 香港| 眉山市| 灵川县| 江陵县| 建平县| 忻城县| 宣威市| 甘洛县| 河东区| 西昌市| 靖安县| 敦化市| 郓城县| 丹东市| 石嘴山市| 明光市| 西城区| 双牌县| 成武县| 龙州县| 乐都县| 崇仁县| 喜德县| 隆昌县| 昂仁县| 辛集市| 长丰县| 叶城县| 肇源县| 建昌县| 民勤县| 惠来县| 合阳县| 崇阳县| 阿拉尔市| 右玉县| 龙江县|