2009-09-03 83 views
19

它不是一個真正的減法我在找。而且我知道它不是聯盟或交集......我得到了一個長而複雜的存儲過程,它返回一個活動和非活動文檔表。我也被給了一個類似的存儲過程,返回另一個只包含活動文檔的表。如何「減去」sql表?

如何使用這兩個存儲過程獲得非活動文檔表?

我們使用SQL Server 2005的

+0

什麼數據庫,什麼是表格和列? – 2009-09-03 14:44:41

+0

這種類型的JOIN的'官方'名稱是'LEFT ANTI SEMI JOIN'(至少這是SQL Server在其執行計劃中調用它的內容,我是誰與機器爭論?)執行此操作通過循環遍歷一個集合中的所有行,並折扣與指定條件匹配的另一個集合中的行。 – 2015-06-22 15:37:16

回答

33

您正在尋找一組操作稱爲MINUS,但在SQL Server關鍵字除外

SELECT ... // all documents 
    EXCEPT 
    SELECT ... // active documents 

我相信EXCEPT集合操作成了在SQL Server 2005中可用。

+1

這是關於底層集合操作的正確答案。 – 2009-09-03 14:45:51

+0

Sql Server上存在嗎? – 2009-09-03 14:48:18

+0

不在SQL Server中。 「這取決於」 – gbn 2009-09-03 14:48:33

3
select * from MyTable1 
where MyTable1.Field1 not in (
    select Field1 from MyTable2) 
11

假設有跡象表明,在兩個表對應唯一的ID:

select * from table_both b 
where not exists (select * from table_active a where a.id = b.id) 
3

我相信除了你正在尋找的東西。語法與UNION或INTERSECT類似。

2

什麼是您的數據庫引擎?

在Oracle中,您可以使用MINUS設置操作。

在MS SQLServer 2005及更新版本中,您可以使用EXCEPT

1

在MS TSQL中,我認爲你想要EXCEPT關鍵字。

query1 EXCEPT query2 

這將返回在第一個查詢中找到的所有行,這些行在第二個查詢中也不存在。

4
SELECT * FROM Table1 
LEFT JOIN Table2 on Table1.id = Table2.id 
WHERE Table2.id IS NULL 

這應該工作在幾乎所有的數據庫引擎

+0

我投票贊成這個答案,因爲'where Table2.id IS NULL'正是它返回相反的結果。對於我來說,編寫WHERE Table2.id是'IS NULL'是非常直觀的,因爲我的列都不能是'NULL'...但是!這是魔法。謝謝你,夥計。 – tehprofessor 2015-06-14 01:13:47

2
SELECT both.* 
FROM both LEFT OTUER JOIN inactives USING (whatever_id) 
WHERE inactives.whatever_id IS NULL; 

SELECT * FROM both 
EXCEPT 
SELECT * FROM inactives; 
8

所有很好的答案,但缺少一點:提問者(OP)已存儲過程...

你必須定義臨時表(基於你的平臺)加載數據

INSERT ... 
EXEC getActive 

INSERT ... 
EXEC getInactive 

然後使用除/ EXISTS /負/ IN/OUTER JOIN的/ etc ...

+1

什麼意思是OP? – 2009-09-04 06:35:54

+0

對不起:「原創海報」 – gbn 2009-09-04 06:50:31

0
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' 

你可以試試這種命令,從另一個減去表。

0

爲了這樣做三個表之間我已經使用下面的查詢減法:

基本上我有三個表..表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) 
1

您也可以與NOT IN條款

做到這一點的例如,假定存儲的過程已經給你表變量稱爲@AllDocuments@ActiveDocuments並且每個文檔具有稱爲標識符列DocId

SELECT * FROM @AllDocuments 
WHERE DocId NOT IN 
    (SELECT DocId FROM @ActiveDocuments) 

根據您的表/列名稱適當調整此值。

0

您可以使用第一個sp返回Active & Inactive和 ,如果文檔status = inactive的WHERE cluse put條件,您將只會獲得非活動文檔。