SQL語言中的MINUS(減法)集合運算符是非常重要的找到兩個給定的數值集合之間的差異意味著找到一個數值集合其中的元素僅存在於前一個集合中而不存在於另一個集合中這項操作是一個很常見也非常重要的操作特別是在處理數據庫圖表發生結構性的變化的時候
這項操作在以下情況中非常有用當你想標識哪些列被添加或者刪除時或者當你改變了表中的初始值並想了解兩個圖表中的數據差別時
例如在測試和產品環境中
這個運算符存在於Oracle SQL中但是很不幸運的是它不存在於SQL Server SQL中這裡我描述一下使用TSQL工具實現功能稍弱一點的MINUS運算符的方法
我編寫了一個名為sp_Minus的程序這個程序執行兩個查詢並找出他們之間的差別當結果集中只出現了一個列時會出現意外情況它實際上使得這個程序成為一個MINUS向量操作而不是一個集合操作這是因為我使用了NOT IN運算符它只作用於一個列而不是一些列的集合這個程序在兩個select(選擇)語句中安置了一個INTO子句並構建了兩個全局臨時表來存儲中間結果然後使用一個NOT IN子句在這兩個表上執行MINUS運算符動作最終生成一個MINUS向量結果
下面是程序代碼
CREATE Procedure sp_MINUS (@query varchar()
@query varchar())
As
Begin
Declare @buildStmt varchar()
Declare @buildStmt varchar()
Declare @pos int
Declare @pos int
Set nocount on
Set @pos = charindex (FROMupper (@query))
Set @pos = charindex (FROMupper (@query))
在語句中輸入into 子句
Set @buildStmt = SUBSTRING (@query@pos) +
as f into ##t +
SUBSTRING (@query@poslen(@query) @pos + )
Set @buildStmt = SUBSTRING (@query@pos) +
as f into ##t +
SUBSTRING (@query@poslen(@query) @pos + )
構建中間全局臨時表
EXEC (@buildStmt)
EXEC (@buildStmt)
執行MINUS操作
Select f from ##t
Where f NOT in (select f from ##t)
刪除表
Drop table ##t
Drop table ##t
Set nocount off
End
Go
應用實例
EXEC @p=sp_minus select categoryid from categories
select categoryidproductid from products where productid <
From:http://tw.wingwit.com/Article/program/Oracle/201311/18213.html