EXISTS結構


EXISTS結構 
  EXISTS結構是一個TSQL函數,這個函數會就圓括號中的子查詢返回一個布爾變量。如果子查詢返回了任意行的話,這個結構就返回真;否則,它就返回假。這個結構特別適用於查詢表中是否存在某些記錄。它也非常適合來決定是否在表中運行更新或者插入語句(在這篇文章中,隨後我將向大家介紹)。 
  Listing A中創建了一個表並插入了一些數據,這樣你就可以利用這張表來看看EXISTS結構是如何工作的了。Listing B中的腳本使用EXISTS結構在SalesHistory表中檢查每一行,並根據已存在的行得到一個變量。這個腳本將返回1(真),這意味着SalesHistory表包含你所要查詢的行。 
  在這種情況下,一旦在SalesHistory表中找到了一條記錄,EXISTS結構就不會繼續查找,並馬上返回1。使用EXISTS結構額外的好處就 是,一旦它找到滿足條件的記錄,就會立即返回。 
  Listing C與上面的腳本類似,但是它的返回值是0,因爲在這個條件下,EXISTS條件不滿足。 由於EXISTS結構的工作原理,所以下面的語句所實現的功能是一樣的。 

  SELECT * FROM SalesHistory
  WHERE EXISTS(SELECT NULL)
  SELECT * FROM SalesHistory
  WHERE 1 = 1
  SELECT * FROM SalesHistory
  WHERE EXISTS(SELECT 1)
  在剛纔的腳本中,你可能會對下面的語句感到迷惑:
  SELECT * FROM SalesHistory
  WHERE EXISTS(SELECT NULL)
 
  因爲NULL在數據庫中是一個值(它是一個未知的值),在出現NULL值的地方EXISTS結構都將返回真。 
  開發者很少使用EXISTS對子查詢進行操作。下面的查詢將返回同樣的結果集,雖然它們的結構不同。第一個查詢使用了EXISTS的相關子查詢,第二查詢在SalesHistory表中,將SalePrice字段與該字段的總平均值進行比較。 

  SELECT * FROM SalesHistory sh
  WHERE EXISTS
  (
      SELECT AVG(SalePrice)
      FROM SalesHistory shi
      HAVING AVG(SalePrice) > sh.SalePrice
  ) 
  SELECT * FROM SalesHistory sh
  WHERE SalePrice <
  (
      SELECT AVG(SalePrice)
      FROM SalesHistory shi
  ) 
  
  你可以使用EXISTS操作來決定,是否對某一個單獨的記錄使用UPDATE或者INSERT語句,就像下面的例子一樣: 

  IF EXISTS
  (
      SELECT * FROM SalesHistory
      WHERE SaleDate = ’1/1/2001’ AND
            Product = ’Computer’ AND 
            SalePrice = 1000
  )
      UPDATE TOP(1) SalesHistory
      SET SalePrice = 1100
      WHERE SaleDate = ’1/1/2001’ AND
            Product = ’Computer’ AND 
            SalePrice = 1000
  ELSE
      INSERT INTO SalesHistory
      (Product, SaleDate, SalePrice)
      VALUES
      (’Computer’, ’1/1/2001’, 1100)
 
  雖然在實際的環境中,你可能不會用到這裏所介紹的例子,但是它們給你演示瞭如何利用EXISTS結構來決定使用哪種DML類型。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章