Если вы хотите найти самую длинную соответствующую ячейку для каждой карты, вы можете использовать что-то вроде этого:
select c.card_number,
min(b.bin) keep (dense_rank first order by length(b.bin) desc) as bin
from bins b
left join cards c
on c.card_number like b.bin || '%'
group by c.card_number;
, а затем объединить эти результаты:
select bin, count(card_number)
from (
select c.card_number,
min(b.bin) keep (dense_rank first order by length(b.bin) desc) as bin
from bins b
left join cards c
on c.card_number like b.bin || '%'
group by c.card_number
)
group by bin;
С некоторым примеромданные в CTE, первый запрос дает:
-- CTEs for sample data
with cards (card_number) as (
select '123456789ABCDEF0' from dual
union all select '123456789ABCDEF1' from dual
union all select '123456ABCDEF7890' from dual
union all select '123456ABCDEF7891' from dual
union all select '123456ABCDEF7892' from dual
),
bins (bin) as (
select '123456' from dual
union all select '123456789' from dual
union all select '2345' from dual
)
-- actual query
select c.card_number,
min(b.bin) keep (dense_rank first order by length(b.bin) desc) as bin
from bins b
left join cards c
on c.card_number like b.bin || '%'
group by c.card_number;
CARD_NUMBER BIN
---------------- ---------
123456789ABCDEF0 123456789
123456789ABCDEF1 123456789
123456ABCDEF7890 123456
123456ABCDEF7891 123456
123456ABCDEF7892 123456
2345
, а второй дает:
BIN COUNT(CARD_NUMBER)
--------- ------------------
123456789 2
2345 0
123456 3
Я использовал левое внешнее соединение между таблицами, чтобы вы получили нулевой счет длякорзины без карт, но вы можете этого не хотеть.