它不是一個真正的減法我在找。而且我知道它不是聯盟或交集......我得到了一個長而複雜的存儲過程,它返回一個活動和非活動文檔表。我也被給了一個類似的存儲過程,返回另一個只包含活動文檔的表。如何「減去」sql表?
如何使用這兩個存儲過程獲得非活動文檔表?
我們使用SQL Server 2005的
它不是一個真正的減法我在找。而且我知道它不是聯盟或交集......我得到了一個長而複雜的存儲過程,它返回一個活動和非活動文檔表。我也被給了一個類似的存儲過程,返回另一個只包含活動文檔的表。如何「減去」sql表?
如何使用這兩個存儲過程獲得非活動文檔表?
我們使用SQL Server 2005的
您正在尋找一組操作稱爲MINUS,但在SQL Server關鍵字除外
SELECT ... // all documents
EXCEPT
SELECT ... // active documents
我相信EXCEPT集合操作成了在SQL Server 2005中可用。
這是關於底層集合操作的正確答案。 – 2009-09-03 14:45:51
Sql Server上存在嗎? – 2009-09-03 14:48:18
不在SQL Server中。 「這取決於」 – gbn 2009-09-03 14:48:33
select * from MyTable1
where MyTable1.Field1 not in (
select Field1 from MyTable2)
假設有跡象表明,在兩個表對應唯一的ID:
select * from table_both b
where not exists (select * from table_active a where a.id = b.id)
我相信除了你正在尋找的東西。語法與UNION或INTERSECT類似。
在MS TSQL中,我認爲你想要EXCEPT關鍵字。
query1 EXCEPT query2
這將返回在第一個查詢中找到的所有行,這些行在第二個查詢中也不存在。
SELECT * FROM Table1
LEFT JOIN Table2 on Table1.id = Table2.id
WHERE Table2.id IS NULL
這應該工作在幾乎所有的數據庫引擎
我投票贊成這個答案,因爲'where Table2.id IS NULL'正是它返回相反的結果。對於我來說,編寫WHERE Table2.id是'IS NULL'是非常直觀的,因爲我的列都不能是'NULL'...但是!這是魔法。謝謝你,夥計。 – tehprofessor 2015-06-14 01:13:47
SELECT both.*
FROM both LEFT OTUER JOIN inactives USING (whatever_id)
WHERE inactives.whatever_id IS NULL;
或
SELECT * FROM both
EXCEPT
SELECT * FROM inactives;
所有很好的答案,但缺少一點:提問者(OP)已存儲過程...
你必須定義臨時表(基於你的平臺)加載數據
INSERT ...
EXEC getActive
INSERT ...
EXEC getInactive
然後使用除/ EXISTS /負/ IN/OUTER JOIN的/ etc ...
什麼意思是OP? – 2009-09-04 06:35:54
對不起:「原創海報」 – gbn 2009-09-04 06:50:31
SELECT roll_number FROM profile WHERE(catagory='Attest and Eat' or catagory='Live and Eat') and status='OK' EXCEPT SELECT roll_number from meal_status WHERE date='29' AND month='1'
你可以試試這種命令,從另一個減去表。
爲了這樣做三個表之間我已經使用下面的查詢減法:
基本上我有三個表..表1,表2,表3。 首先,我已經做了表1和表2的減法,然後做了以前的查詢和表的結果之間的減法3.
select v3.Material, ((v1.Qty-v2.Qty)-v3.Qty) as Quantity
from table1 v1, table2 v2, table3 v3
where (v1.Material=v2.Material
and v1.Material=v3.Material
and v2.Material=v3.Material)
您也可以與NOT IN
條款
做到這一點的例如,假定存儲的過程已經給你表變量稱爲@AllDocuments
和@ActiveDocuments
並且每個文檔具有稱爲標識符列DocId
SELECT * FROM @AllDocuments
WHERE DocId NOT IN
(SELECT DocId FROM @ActiveDocuments)
根據您的表/列名稱適當調整此值。
您可以使用第一個sp返回Active & Inactive和 ,如果文檔status = inactive的WHERE cluse put條件,您將只會獲得非活動文檔。
什麼數據庫,什麼是表格和列? – 2009-09-03 14:44:41
這種類型的JOIN的'官方'名稱是'LEFT ANTI SEMI JOIN'(至少這是SQL Server在其執行計劃中調用它的內容,我是誰與機器爭論?)執行此操作通過循環遍歷一個集合中的所有行,並折扣與指定條件匹配的另一個集合中的行。 – 2015-06-22 15:37:16