2013-11-04 64 views
2

我需要一个SQL语句会发现有一个ActivityID = 1表中的所有OrderIDs但不是一个ActivityID = 2SQL语句来获取有一个属性,但不是另一个属性值

因此,这里是一个示例表:

OrderActivityTable:

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

因此,在这个例子中,订单ID - 1有1和2的活性,使不应该返回结果。订单2和3有一个活动1,但不是2 ...所以他们应该返回结果。

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

什么我以前试过是:

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

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

+0

您正在使用哪些DBMS?甲骨文? Postgres的? –

+0

SQL Server我相信 –

+0

谢谢你们,解决方案工作。你们真棒。 –

回答

2

您可以使用外自连接此:

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 

您还可以使用WHERE NOT IN解决方案迈克克里斯滕森的,或alfasin的相关子查询解决方案,但在我的经验,这种方法通常具有最佳性能(我使用MySQL - 其他实现中的结果可能会有所不同)。在理想的世界中,DBMS会认识到这些都是相同的,并且对它们进行等效优化。

+0

'+ 1' - 同意这是最好的解决方案。 –

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) 
2

喜欢的东西:

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

这将选择在OrderActivityTable其中ActivityID为1的一切,但是过滤掉包含一个的2

-1

ActivityIDOrderID行列表试试这个说法:

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

如果'ActivityID'是1,那么当然*不是2. –

+0

你是对的Mike。我的错。 – George

相关问题