如何在没有游标的情况下执行递归查询

时间:2010-09-28 00:06:48

标签: sql

我有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

4 个答案:

答案 0 :(得分:2)

解决问题没有任何递归。

使用NOT EXISTS

SELECT p.id
  FROM PERSON p
 WHERE NOT EXISTS(SELECT NULL
                    FROM ORDER o
                   WHERE o.id = p.id
                     AND o.qty = 0)

使用NOT IN

SELECT p.id
  FROM PERSON p
 WHERE p.id NOT IN (SELECT o.id
                      FROM ORDER o
                     WHERE o.qty = 0)

使用LEFT JOIN / IS NULL

   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