Вы можете использовать самостоятельное соединение:
select a.cust_id
from transaction a, transactions b
where a.cust_id = b.cust_id
and a.item = 'book'
and b.item = 'shoe'
Использование двух ссылок на таблицу transactions
создает декартово произведение (каждая строка объединяется с каждой строкой) из всех покупателей book
и shoe
, которые, если ограничено предложением a.cust_id = b.cust_id
, исключат все те, которые купили только один из них, как показано ниже, где только клиент 1 удовлетворяет всем требованиям (X 'book' X 'shoe'
, где X
- любой идентификатор клиента, но одинаковый в обоих столбцах 1 и 3 набор результатов):
a.cust_id | a.item | b.cust_id | b.item | include?
----------+--------+-----------+--------+---------
1 | book | 1 | book |
1 | shoe | 1 | book |
2 | book | 1 | book |
3 | shoe | 1 | book |
1 | book | 1 | shoe | yes
1 | shoe | 1 | shoe |
2 | book | 1 | shoe |
3 | shoe | 1 | shoe |
1 | book | 2 | book |
1 | shoe | 2 | book |
2 | book | 2 | book |
3 | shoe | 2 | book |
1 | book | 3 | shoe |
1 | shoe | 3 | shoe |
2 | book | 3 | shoe |
3 | shoe | 3 | shoe |
Возможно, есть способ сделать это и с помощью явного оператора join
, но, поскольку я использую достаточно умную СУБД, чтобы понять это, мне все равно. Я не буду указывать , какую СУБД, поскольку я не хочу начинать религиозную войну: -)