我需要一个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
这似乎没有得到我想要的结果。我认为答案有点复杂。
答案 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)