Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2015, 16:30   #1
Glen
Форумчанин
 
Аватар для Glen
 
Регистрация: 09.02.2011
Сообщений: 150
По умолчанию SQL Server:поиск строк c игнорированием leading zeroes

У меня есть Sql Server 2008R2. В нём 2 таблицы:

Код:
CREATE TABLE [SmallerTable](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Name] [varchar](50) NULL,
CONSTRAINT [SmallerTable.PK] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

и

Код:
CREATE TABLE [LargerTable](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Name] [varchar](50) NULL,
 CONSTRAINT [LargerTable.PK] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]



В [SmallerTable] у меня 600,000 строк
В [LargerTable] у меня 7,000,000 строк. [SmallerTable] и [LargerTable] проиндексированы и по полю [Name].

Мне надо написать скрипт который поищет строки из [SmallerTable].[Name] среди строк [LargerTable].[Name]. То есть выдаст нечто вроде такого:

Код:
CREATE TABLE [MatchedRows](
	[SmallerTableID] [int] NOT NULL,
	[LargerTableID] [int] NOT NULL
)


где каждая строка таблицы говорит: "значение Name из строки [SmallerTable] с ключом [SmallerTableID] равно значению Name из строки [LargerTable] с ключом [LargerTableID]"

И - главное - поиск должен игнорировать начальные нули (если они есть) как в [SmallerTable].Name, так и в [LargerTable].Name.
То есть такик вот пары значений должны считаться "равными":

SmallerTable: 11 LargerTable: 011
SmallerTable: 011 LargerTable: 11
SmallerTable: 011 LargerTable: 0011
SmallerTable: 0011 LargerTable: 011


Что может облегчить мне задачу - я увидел что в [SmallerTable] все значения Name по реальной длине не превышают 7 символов.

Как сделать так чтобы этот скрипт работал быстро?
Glen вне форума Ответить с цитированием
Старый 13.09.2015, 16:49   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Попробуй создать функциональный индекс.
Код:
 CREATE INDEX IND ON MatchedRows (CAST (SmallerTableID AS int));
 CREATE INDEX IND ON MatchedRows (CAST (LargerTable AS int));
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.09.2015, 16:53   #3
Glen
Форумчанин
 
Аватар для Glen
 
Регистрация: 09.02.2011
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Попробуй создать функциональный индекс.
Код:
 CREATE INDEX IND ON MatchedRows (CAST (SmallerTableID AS int));
 CREATE INDEX IND ON MatchedRows (CAST (LargerTable AS int));
тут естьтакое обстоятельство:
- все строки таблицы SmallerTable представимы как числа ('1', '01' и тд)
- но вот не все строки таблицы LargerTable представимы как числа. Там могут встретиться скажем 'T01' и тд
Glen вне форума Ответить с цитированием
Старый 13.09.2015, 17:10   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Те записи LargerTable, которые не представимы числом опусти. С помощью ISNUMERIC например
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.09.2015, 17:15   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
записи LargerTable, которые не представимы числом опусти.
А если они должны участвовать в запросе? Стоимость то повысится.
Цитата:
Glen
Можно попробовать написать свою функцию, отсекающую лидирущие нули, и ее использовать в построении индекса.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.09.2015, 17:23   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
А если они должны участвовать в запросе?
А зачем? Для них все равно нет соответствия SmallerTable. Или буква спереди не считается? ТС уточни
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перекатить с sql server на другой sql server ts-alan ASP.NET 2 05.06.2015 00:52
MS SQL SERVER 2005 sql querry reihtmonbern БД в Delphi 18 26.08.2012 17:06
Web server и SQL server - администрирование Zak Ysmila Общие вопросы .NET 1 02.06.2011 19:29
Доступ к БД (SQL server) в ОС Windows server 2003 Mann SQL, базы данных 2 07.12.2008 19:15
C# + SQl server kommunist Общие вопросы .NET 0 24.07.2008 21:09