3

我需要一个 SQL 语句来查找表中具有 ActivityID = 1 但不是 ActivityID = 2 的所有 OrderID

所以这是一个示例表:

订单活动表:

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

4 回答 4

4

您可以为此使用外部自联接:

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 INMike Christensen 的解决方案,或者 alfasin 的相关子查询解决方案,但根据我的经验,这种方法通常具有最好的性能(我使用 MySQL——在其他实现中结果可能会有所不同)。在理想的世界中,DBMS 会认识到这些都是相同的,并等效地优化它们。

于 2013-11-04T22:05:43.000 回答
2

就像是:

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

这将选择OrderActivityTablewhere ActivityIDis 1 中的所有内容,但过滤掉OrderID包含ActivityID2 的行列表。

于 2013-11-04T22:05:50.420 回答
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)
于 2013-11-04T22:05:32.423 回答
-1

试试这个说法:

SELECT OrderID, ActivityID 
FROM OrderActivityTable 
WHERE ActivityID = 1 
AND ActivityID NOT IN (2)
于 2013-11-04T22:10:23.440 回答