Поиск по списку шаблонов

LelikB
Дата: 22.01.2009 10:43:00
Добрый день!
Есть таблица номеров банковских карт (#Cards) и есть таблица шаблонов номеров карт (#BIN), отвечающих определенным требованиям. Необходимо отобрать все карточки, номера которых подпадают хотя бы под один шаблон из таблицы #BIN.
К сожалению, не нашел более изящного варианта, чем через курсор, может подскажете, как это можно сделать лучше и быстрее?

--таблицы:
create table #Cards
	(Numb varchar(18))

create table #BIN
	(BIN varchar(18))

CREATE TABLE #ourbin
	(
	Bin			varchar(18),
	Numb	    varchar(18)
	)

--номера карт (несколько тысяч номеров ежедневно)
insert into #Cards(Numb) values ('1234567812345678')
insert into #Cards(Numb) values ('1234567812346982')
insert into #Cards(Numb) values ('1234567834578686')
insert into #Cards(Numb) values ('3466877678802369')
insert into #Cards(Numb) values ('1234567789873245')
insert into #Cards(Numb) values ('5478134034772598')
insert into #Cards(Numb) values ('4579833468347672')
insert into #Cards(Numb) values ('4579543423455656')
--шаблоны (около 500 записей)
insert into #BIN(BIN) values ('12345678')
insert into #BIN(BIN) values ('123456')
insert into #BIN(BIN) values ('4579')


DECLARE @bin varchar(18)

DECLARE bin_cursor CURSOR
FOR SELECT BIN FROM #BIN

OPEN bin_cursor
FETCH NEXT FROM bin_cursor INTO @bin
WHILE @@FETCH_STATUS = 0
BEGIN

	SELECT @bin=@bin+'%'
	INSERT INTO #ourbin	
		SELECT @bin, c.Numb
		FROM #Cards c
		WHERE c.Numb like @bin
			and not exists (SELECT #ourbin.Numb FROM #ourbin WHERE #ourbin.Numb=c.Numb)
	FETCH NEXT FROM bin_cursor INTO @bin
END
DEALLOCATE bin_cursor

select * from #ourbin

drop table #Cards
drop table #BIN
drop table #ourbin

Glory
Дата: 22.01.2009 10:45:31
SELECT *
FROM #Cards c
INNER JOIN #BIN b ON c.Numb like b.bin+ '%'
iap
Дата: 22.01.2009 11:12:59
Может, так лучше (если запись подходит для нескольких шаблонов):
SELECT *
FROM #Cards c
WHERE EXISTS(SELECT * FROM #BIN b WHERE c.Numb LIKE b.bin+ '%')
LelikB
Дата: 23.01.2009 08:36:17
Вот я чайник.
Как я не заметил очевидного? Более извращенный способ, чем мой, похоже, придумать сложно.
Спасибо!