巨大的建筑逗概,總是由一木一石疊起來的弟晚,我們何妨做做這一木一石呢?我時常做些零碎事,就是為此卿城。
這是對的枚钓,但是我沒有說過這句話! —— 魯迅
先看一個例子
select name from user u where u.name in ('zhangsan', 'lisi');
有一個用戶表user瑟押,現(xiàn)在user表中有l(wèi)isi,wangwu,但是沒有zhangsan,上面語句查出來的結果搀捷,肯定是lisi。
那么我現(xiàn)在的需求是把zhangsan查出來多望,也就是嫩舟,我有一個常量列表,我要查詢這些常量有哪些在表中不存在怀偷,是新數(shù)據(jù)家厌。
將常量作為臨時表進行關聯(lián)查詢.
這里有 zhangsan,lisi等一些常量,現(xiàn)在的目的是椎工,假裝這些數(shù)據(jù)是從表中查出來的饭于。如下:
select 'zhangsan' as name
union select 'lisi'
在oracle中,要用到臨時表dual维蒙,而mysql中不需要掰吕,可以不from任何表.
上面的sql,就會查出來 zhangsan,lisi這兩個值,并且屬性名為name.
聯(lián)合查詢
select * from (select 'zhangsan' as name
union select 'lisi') t
where not exists(select 1 from user u where t.name = u.name)
修改第一個查詢
因為我們的常量是一個list颅痊,在編程語言中殖熟,比如mybaties中,是可以用foreach等循環(huán)結構拼接出來的八千。
但是通過觀察吗讶,發(fā)現(xiàn),第一個select和非第一個select是不一樣的恋捆,其他的有union照皆,而第一個沒有union,這樣拼接的時候,就要對第一個做特殊處理沸停。
我們可以讓第一個什么也不查出來膜毁,即空,這樣就行了愤钾。如下:
select * from
(select name from user where id = -1
union select 'zhangsan'
union select 'penglx') t
where not exists(select 1 from user u where t.name = u.name);