熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

跟我學SQL:從子表裡刪除數據

2013-11-15 14:41:47  來源: SQL Server 

  在這篇文章裡我要描述一下如何從表格裡刪除列要刪除的這些列同時還要依賴於其他表格的標准要解決這個問題就需要一個很聰明而且完全遵守SQL子查詢聲明的應用程序
  我必須提醒讀者的是盡管查詢可能會遵守SQL的標准但是眾多的數據庫生產商會以不同的句法支持實現SQL以下這個解決方案應該適合於大多數數據庫但是如果你的結果有出入就還是應該查看一下文檔同時由於這個查詢要處理DELETE聲明所以你應該在將其應用於真實的生產環境以前在實驗數據上進行測試
  
  需要更多的背景信息?
  查看這些文章就能快速上路
  《SQL基礎I查數據查詢》涉及到了DELETE查詢的使用
  《使用SQL子選項來合並查詢》說明子選項查詢能夠減少對數據庫請求的數量並提供了例子
  《SQL基礎查詢多個表》提供了更多關於子選項的信息還講到了使用單個查詢就能訪問多個表格的多種其他方法
  
  寵物店的例子
  要解釋如何進行這種類型的列刪除我會使用如下這個數據庫的表格該數據庫叫做PetStore並包含有清單(inventory)信息在叫做品種(breed)的表A裡我存儲有每種動物的信息和寵物店庫存的信息在叫做清單的表B裡包含有商店裡特定動物的信息
  
  在這個例子裡我們先假設商店把整窩Shitzu小狗都賣完了我可以使用breed表格裡的breed_id字段來刪除Shitzu清單裡的所有項目就像這樣
  
  DELETE FROM inventory WHERE breed_id IN
  (SELECT breed_id FROM breed WHERE breed_name = Shitzu);
  
  首先我要指定需要刪除記錄的表格在這裡是清單表格然後再將識別字段breed_id同子選項子句的結果反復比對我知道要找的是Shitzus所以就能直接刪掉他們而不用再在單獨的請求裡查詢breed_id
  
  我必須要警告你的是以這種方式使用DELETE聲明是危險的只有在你對數據庫的結構很熟悉的情況下才能使用這些聲明DELETE查詢會從受影響的表格裡刪除掉全部列你應該知道這對你所管理著的數據意味著什麼有個好辦法是使用SELETE *這個短語替代DELETE關鍵字來對DELETE聲明的子查詢結果進行測試這樣就能保證結果裡含有你要刪除的所有東西就像這樣
  
  SELECT * FROM inventory WHERE breed_id IN
  (SELECT breed_id FROM breed WHERE breed_name = Shitzu);
  
  DELETE和JOIN聯用
  有人問到了解決這個問題另一個可能的辦法把JOIN子句和DELETE聲明聯合使用由於以前沒有使用過這種方法我就研究了一下發現SQL Server的文檔聲明支持這個方法盡管它不符合SQL在經過測試和詢問各種數據庫平台的老手之後我發現把DELETE和JOIN聲明聯合使用在我測試過的任何平台上都行不通
  
  從多個表格裡一次刪除
  以上的解決方案還沒有解釋如何使用父表從多個子表裡刪除信息但是SQL規范裡沒有提供完成這項任務的標准解決方案
  
  DELETE的聲明不能把多個表格作為一個參數接受作為一個具有破壞性的查詢這能保證在命令要被執行的地方不會出現歧義此外這個限制防止了在單個聲明內將AND和多個子查詢聯用如果測試SELECT聲明的結果用以檢查DELETE查詢將要影響到的是哪些數據你會發現SELECT會返回多個表格的清單DELETE不會影響到的多個子查詢不在其中
  
  有很多可能的方法能夠滿足你的需求例如在表格裡創建一個字段用以指明該項目是否為活動的或者你可以使用一些數據庫裡的預存程序在每個所需的DELETE查詢裡迭代

From:http://tw.wingwit.com/Article/program/SQLServer/201311/22191.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.