2009-09-03 56 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条件,您将只会获得非活动文档。