我有2张桌子
id
----
1
2
Id Qty
---------
1 3
1 0
2 2
如何让订单大于0的所有人从未下过0订单?所以结果只有Person.Id 2
我想我知道如何用游标做到这一点,但想找到一种不同的方式。
编辑:
我认为试图让这个例子简短易读,我忘记了一个详细的...我不是真的过滤了Id的。我按文字过滤。
正确的例子是一张Customer表,带有一个订单表,我想要所有订购鸡肉的人,但没有订购鸡肉和鱼。
id
----
1
2
3
Id Dish
----------------
1 chicken
2 chicken
2 fish
3 fish
所以结果应该只是客户ID 1
答案 0 :(得分:2)
解决问题没有任何递归。
SELECT p.id
FROM PERSON p
WHERE NOT EXISTS(SELECT NULL
FROM ORDER o
WHERE o.id = p.id
AND o.qty = 0)
SELECT p.id
FROM PERSON p
WHERE p.id NOT IN (SELECT o.id
FROM ORDER o
WHERE o.qty = 0)
SELECT p.id
FROM PERSON p
LEFT JOIN ORDER o ON o.id = p.id
AND o.qty = 0
WHERE o.id IS NULL
答案 1 :(得分:0)
这不是递归的,但它 是一种“不同的方式”:
SELECT DISTINCT id
FROM Order
WHERE Qty > 0
AND id NOT IN (SELECT DISTINCT id FROM Order WHERE Qty = 0)
内部查询获取已下达零订单的ID列表,外部查询获取具有(a)放置非 -zero订单的ID的列表,以及(b)不是在第一个列表中。
答案 2 :(得分:0)
select p.id
from Person p
left join Order o on p.id = o.id
group by p.id
having count(o.id) > 0 and min(o.qty) > 0
答案 3 :(得分:0)
对于修订后的问题的单一答案,请尝试:
SELECT Id
FROM Order
GROUP BY Id
HAVING SUM(case when Dish = 'chicken' then 1 else 0 end) > 0
AND SUM(case when Dish = 'fish' then 1 else 0 end) = 0