我剛剛學會(昨天)使用「存在」而不是「in」。SQL - 表別名範圍
BAD
select * from table where nameid in (
select nameid from othertable where otherdesc = 'SomeDesc')
GOOD
select * from table t where exists (
select nameid from othertable o where t.nameid = o.nameid and otherdesc = 'SomeDesc')
而且我對此有些疑問:
1)我的理解是解釋:「之所以這樣比較好是因爲只有匹配的值將被替代返回構建一個龐大的可能結果列表「。這是否意味着雖然第一個子查詢可能返回900個結果,但第二個子查詢只返回1個(是或否)?
2)在過去,我有RDBMS抱怨:「只有前1000行可能被檢索」,這第二種方法可以解決這個問題嗎?
3)第二個子查詢中別名的範圍是什麼?......別名只存在於括號中嗎?
例如
select * from table t where exists (
select nameid from othertable o where t.nameid = o.nameid and otherdesc = 'SomeDesc')
AND
select nameid from othertable o where t.nameid = o.nameid and otherdesc = 'SomeOtherDesc')
也就是說,如果使用相同的別名(鄰爲表othertable)在第二個「存在」,它將出現任何問題與所述第一存在?還是他們完全獨立?
這是Oracle僅與其相關或對多數RDBMS有效嗎?
非常感謝
它的「存在」,而不是「存在」。 – Constantin 2008-10-09 19:41:29