SELECT o.customerId
FROM Order o
WHERE (SELECT count(distinct b.bookId)
FROM Book b
WHERE o.bookId = b.bookId
AND b.title in ('BOOK A', 'BOOK B')
) = 2;
这实质上将检查的每一订单的书的数量,限制在 “BOOK A” 和 “书B” 为2,也就是即两本书必须以相同的顺序。
如果你想寻找的书籍在同一客户的任何命令,你需要的order
的第二个实例:
SELECT o.customerId
FROM Order o
WHERE (SELECT count(distinct b.bookId)
FROM Book b JOIN Order oo ON oo.bookId = b.bookId
WHERE o.customerId = oo.customerId
AND b.title in ('BOOK A', 'BOOK B')
) = 2;
这可以优化,假设表Customer
:
SELECT c.customerId
FROM Customer c
WHERE (SELECT count(distinct b.bookId)
FROM Book b JOIN Order oo ON oo.bookId = b.bookId
WHERE c.customerId = oo.customerId
AND b.title in ('BOOK A', 'BOOK B')
) = 2;
这样可以避免结果中出现重复的客户,并加入更小的表格,因此应该更快。
所有这三种解决方案都可以轻松扩展到三,四本...书籍。只需在IN
中列举它们并调整计数。
这将返回客户ID,如果他们订购了Book A – Ghost
@Ghost的两份副本,我纠正了这一点,计算不同的'bookId'秒。 – FrankPl