用于获取具有一个属性但不具有另一个属性的值的SQL语句

时间:2013-11-04 22:01:13

标签: sql

我需要一个SQL语句,它会在表中找到ActivityID = 1但不是ActivityID = 2的所有OrderID

所以这是一个示例表:

OrderActivityTable:

OrderID  // ActivityID
1       // 1
1       // 2
2       // 1
3       // 1

因此,在此示例中,OrderID - 1的活动为1 AND 2,因此不应返回结果。订单2和3有一个活动1,但不是2 ...因此他们应该返回结果。

最终结果应该是一个带有OrderID列的表,其中只有2和3作为行。

我之前尝试过的是:

select OrderID, ActivityID from OrderActivityTable where ActivityID = 1 AND NOT ActivityID = 2

这似乎没有得到我想要的结果。我认为答案有点复杂。

4 个答案:

答案 0 :(得分:3)

您可以使用外部自联接:

SELECT *
FROM OrderActivityTable t1
LEFT JOIN OrderActivityTable t2
ON t1.OrderID = t2.OrderID AND t2.ActivityID = 2
WHERE t1.ActivityID = 1
AND t2.OrderID IS NULL

你也可以使用Mike Christensen的WHERE NOT IN解决方案,或alfasin的相关子查询解决方案,但根据我的经验,这种方法通常具有最佳性能(我使用MySQL - 结果可能在其他实现中有所不同)。在理想的世界中,DBMS会认识到这些都是相同的,并且等效地优化它们。

答案 1 :(得分:2)

类似的东西:

SELECT OrderID, ActivityID FROM OrderActivityTable
WHERE ActivityID = 1
AND OrderID NOT IN (select distinct OrderID from OrderActivityTable where ActivityID = 2);

这将选择OrderActivityTable ActivityID为1的所有内容,但会过滤掉包含OrderID为2的ActivityID行列表。

答案 2 :(得分:0)

select OrderID, ActivityID from OrderActivityTable t
where 
ActivityID = 1 AND  
NOT not exists (select 1 from OrderActivityTable tt 
 where tt.OrderID = t.OrderID AND
 tt.ActivityID = 2)

答案 3 :(得分:-1)

试试这句话:

SELECT OrderID, ActivityID 
FROM OrderActivityTable 
WHERE ActivityID = 1 
AND ActivityID NOT IN (2)