Điều này có thể được thực hiện với phép chia quan hệ :
select r.order_id from (
select
dividend.*
from your_table_or_query as dividend -- assumes no duplicates in `dividend`; use `distinct` if there are any
inner join divisor
on dividend.value = divisor.value
) as r
group by r.order_id
having count(*) = (select count(*) from divisor);
kết quả:
+----------+
| order_id |
+----------+
| 1236 |
| 1239 |
+----------+
2 rows in set (0.00 sec)
nơi truy vấn của bạn là your_table_or_query
và
select 260 as value from dual union select 264 as value from dual
là divisor
.
Thao tác này sẽ trả về id đơn hàng 1236 và 1239; sau đó chúng có thể là join
ed sang truy vấn ban đầu để nhận tất cả các hàng có id đơn hàng đó nếu đó là những gì bạn muốn.
Truy vấn đầy đủ cùng với câu lệnh chèn:
create table divisor (value int);
insert into divisor values (260), (264);
create table your_table_or_query (value int, order_id int);
insert into your_table_or_query values (260, 1234), (260, 1235), (260, 1236), (264, 1236), (260, 1237), (260, 1238), (260, 1239), (264, 1239), (264, 1240), (260, 1241);
select y.* from (
select r.order_id from (
select
dividend.*
from your_table_or_query as dividend
inner join divisor
on dividend.value = divisor.value
) as r
group by r.order_id
having count(*) = (select count(*) from divisor)
) as quotient
inner join your_table_or_query y
on quotient.order_id = y.order_id;
Kết quả:
+-------+----------+
| value | order_id |
+-------+----------+
| 260 | 1236 |
| 264 | 1236 |
| 260 | 1239 |
| 264 | 1239 |
+-------+----------+
4 rows in set (0.00 sec)