一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL中使用自定義變量 編寫偷懶的UNION示例

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

2020-01-06 15:49MYSQL教程網 Mysql

以下是對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表中查詢得到的。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 视频一区在线免费观看 | 成在线人免费视频一区二区三区 | 九九精品成人免费国产片 | 99久久国产综合精品网成人影院 | 性德国高清xxxxbbbb | 亚洲AV无码国产精品午夜久久 | 国产精品99久久免费观看 | 国产成人啪精品午夜在线播放 | 99这里只有精品视频 | 亚洲成片在线看 | 久9视频这里只有精品123 | 色橹| 不卡视频一区二区 | 精品一二三区久久AAA片 | 国产欧美成人免费观看 | 亚洲国产在线午夜视频无 | 香蕉大久久| 99久久香蕉国产线看观香 | 九九大香尹人视频免费 | 国精品午夜dy8888狼人 | 日本啊v在线观看 | 国产综合社区 | 无限资源在线观看完整版免费下载 | 国产成人福利免费视频 | 成人私人影院在线观看网址 | 国产愉拍精品视频手机 | 白丝美女同人18漫画 | 母爱成瘾在线观看 | 白丝女仆被啪到深夜漫画 | 污网站免费观看在线高清 | www.色呦呦.com | 双性总裁(h)| 免费看男人使劲躁女人小说 | 91在线老师啪国自产 | 五月丁开婷婷 | 我半夜摸妺妺的奶C了她软件 | 99视频有精品视频免费观看 | 美女靠逼免费网站 | 手机av | 亚洲成人黄色 | 国色天香视频完整版 |