今天遇到一個數(shù)據(jù)庫查詢問題:兩個表之間的連接的on過濾和where過濾的問題。
一般來說是在on后面的條件是兩個表之間連接條件,也就是兩個表之間的對應(yīng)字段等于起來;where后面的條件是用傳進來的一些參數(shù)對上面連接過后的條件再過濾。如下:
select 1 from t_herotask ht inner join t_task t on ht.taskid=t.code
inner join t_taskobjective tbj on t.id=tbj.taskID and tbj.ItemType <> '2' left outer join t_card card on ht.heroId=card.heroId and card.typeid = tbj.ItemCode where ht.heroId=@heroID and t.code=@taskID and card.CONTAINERTYPE=1 group by card.typeid, t.id having sum(CURRENTSTACKS) is NULL OR (select sum(tbj.num) from t_taskobjective tbj where tbj.taskid=t.id and tbj. itemcode=card.typeid and tbj.itemtype<>'2') > sum(CURRENTSTACKS)) 但是這樣不行必須要,必須要這樣才行:
select 1 from t_herotask ht inner join t_task t on ht.taskid=t.code
inner join t_taskobjective tbj on t.id=tbj.taskID and tbj.ItemType <> '2' left outer join t_card card on ht.heroId=card.heroId and card.typeid = tbj.ItemCode and card.CONTAINERTYPE=1 where ht.heroId=@heroID and t.code=@taskID group by card.typeid, t.id having sum(CURRENTSTACKS) is NULL OR (select sum(tbj.num) from t_taskobjective tbj where tbj.taskid=t.id and tbj. itemcode=card.typeid and tbj.itemtype<>'2') > sum(CURRENTSTACKS)) 上面的移上去的條件不是從外面?zhèn)鬟M來的值,而只是簡單過濾一下這個字段,但是不知道什么原因,像下面這樣把本來應(yīng)該放在where后面的條件過濾放到on后面就不行。難道SQL語句的執(zhí)行就是這樣的?很是神奇。。。
最后得出了一個結(jié)論:如果過濾的條件里沒有用到外部傳值就放在on后面,否則就放在where后,當然只是在表間連接的時候才會用on這個關(guān)鍵詞哈??!
|
|