2017-04-13 93 views
0

我有2個與值(1),(2) 它是EXISTS功能混淆?

  • T2(COL)與值(1)
  • 該查詢表

    • T1(COL):

      SELECT * 
      FROM t1 
      WHERE EXISTS (SELECT 1 FROM t1 WHERE t1.col >= 2) 
      

      t1返回兩個行,這是可以的,因爲EXISTS至少返回一行,所以where子句變爲TRUE。現在

      第二查詢

      SELECT * 
      FROM t1 
      WHERE EXISTS (SELECT 1 FROM t2 WHERE t1.col = t2.col) 
      

      這僅返回1行。爲什麼?在這種情況下,EXISTS還返回至少一行,那麼爲什麼不從「t1」表返回的所有行呢?

      EXISTS()函數是如何工作的?

    +2

    'EXISTS'正在評估't1'中每一行的條件。 't2'中沒有匹配't1.col = 2'的地方。 –

    回答

    2

    在第一個查詢,還有就是你exists()內到外表中沒有參考,並自該查詢結果爲true您的查詢就會成爲

    select * from t1 where 1 = 1 ; 
    

    你的第二個查詢確實有內外部表的引用您的exists(),並針對每個值t1.col進行評估。所以對於t1.col = 1你的exists()返回true的行,當t1.col = 2那麼你的exists()返回false。所以你的結果集只包含那個行,其中t1.col = 1

    0

    如果EXISTS找到一條或多條記錄,則返回true。 既然你有值1和2以及T2與值列T1 1.

    SELECT * 
    FROM t1 
    WHERE EXISTS (SELECT 1 FROM t2 WHERE t1.col = t2.col) 
    

    現在意味着

    SELECT * 
    FROM t1 
    WHERE EXISTS (SELECT 1 FROM t2 WHERE 1 = 1) 
    

    所以你只有1行,而不是2