Выбор записей с префиксом

avatar
DDLearn
1 июля 2021 в 17:37
71
4
1

Я новичок в SQL Server, и мне нужна помощь в написании запроса

Мне дали около 400 идентификационных номеров, которые выглядят как (123456, 1234555, 342345 и т. д.). Я должен выбрать все записи из таблицы с этими идентификаторами. Проблема заключается в том, что столбец, который ссылается на этот идентификатор (ActionIDreference), имеет префикс (A) перед некоторыми из его значений (A123456, A1234555, A342345). иногда он (ActionIDreference) не имеет буквы «А». Мне нужно учитывать любые изменения в этом столбце, которые ссылаются на эти конкретные идентификаторы.

Я хочу получить эти 400 идентификаторов из столбца, независимо от того, есть ли перед ним буква А или если нет буквы А, то без нее.

Имя таблицы — ActionReport.

Я использую Sql Server

Надеюсь, вопрос ясен.

Спасибо за помощь

Источник
Yitzhak Khabinsky
1 июля 2021 в 19:44
0

Задавая вопрос, вы должны предоставить минимальный воспроизводимый пример: (1) DDL и выборочное заполнение данных, т. е. таблицы CREATE плюс операторы INSERT T-SQL. (2) Что вам нужно сделать, т. е. логика и ваш код попытаются реализовать ее в T-SQL. (3) Желаемый результат, основанный на примерах данных в № 1 выше. (4) Ваша версия SQL Server (SELECT @@version;). Все в рамках вопроса, без изображений.

Ответы (4)

avatar
Venkataraman R
2 июля 2021 в 05:24
0

Вы можете загрузить табличную переменную со значениями id и значениями id с префиксом A.

DECLARE @table table(id varchar(10))

-- insert without prefix
insert into @table
SELECT cast(id as varchar(10)) as id FROM (VALUES ('12345'),('13345')) as t(id)
-- insert with prefix
insert into @table
SELECT cast(CONCAT('A',id) as varchar(10)) FROM  @table

Теперь вы можете применить условие IN в основной таблице для идентификаторов из табличной переменной

SELECT * FROM ActionReport where ActionReportIDReference IN
(
Select id from @table) 
avatar
Stu
1 июля 2021 в 19:44
0

Попробуйте следующее. Создайте временную таблицу для хранения значений идентификатора

.
Create table #temp (Id varchar(10) not null primary key) /* data type should match the target table*/

Вставьте свой список значений

Insert into #temp values ('123456'),('345678'),...

обновите таблицу и префикс на "A"

update #temp set Id='A' + Id

Теперь повторите свою первую вставку, чтобы ваша таблица закончилась вашим списком значений как с префиксом "A", так и без него.

Теперь запустите запрос на соединение с временной таблицей

select a.*
from #temp t
join fromActionReport a on a.ActionIDreference=t.Id
avatar
Gordon Linoff
1 июля 2021 в 17:57
1

Просто используйте in и охватите все возможности:

where ActionIDreference in ('123456', '1234555', '342345', '123456', 'A1234555', 'A342345')

Любой другой подход может привести к неоптимальному плану запроса. Да, SQL Server может обрабатывать 800 значений в списке IN, и создание 800 значений не должно быть намного сложнее, чем создание 400.

avatar
Kazi Mohammad Ali Nur
1 июля 2021 в 17:44
1

Вы можете использовать функцию replace(), чтобы сначала избавиться от 'A' из всех идентификаторов, а затем просто сравнить со списком идентификаторов с in.

 select * fromActionReport
 where replace(ActionIDreference,'A','')in (123456, 1234555, 342345 )

Другой подход может заключаться в использовании union all и stuff()

.
 select * fromActionReport
 where ActionIDreference like 'A%' and STUFF(ActionIDreference,1,1,'') in (123456, 1234555, 342345 )

 union all

 select * fromActionReport
 where ActionIDreference not like 'A%' ActionIDreference in (123456, 1234555, 342345 )

Создайте таблицу для хранения значений ActionIDreference, которые вы хотите найти. Затем вставьте в него 400 идентификаторов.

create table search_criterion (ActionIDreference varchar(20));
insert into search_criterion values('123456'), ('1234555'), ('342345'), ('123456');

Теперь вы не знаете, какие значения имеют префикс "A" в вашей таблице, поэтому вы скопируете все строки и повторно вставите в таблицу с префиксом "A".

insert into search_criterion select 'A'+ActionIDreference from search_criterion;

Теперь ваш фактический запрос будет таким:

 select * fromActionReport
 where ActionIDreference in (select ActionIDreference from search_criterion  );
DDLearn
1 июля 2021 в 18:41
0

Спасибо тебе за это. Выполнение этого запроса занимает много времени, в настоящее время выполняется более 15 минут и все еще выполняется.

DDLearn
1 июля 2021 в 19:12
0

Обновление: возникла ошибка «System.OutOfMemoryException».

Kazi Mohammad Ali Nur
1 июля 2021 в 19:22
0

Сколько строк в таблице? какой подход вы пробовали?

DDLearn
1 июля 2021 в 19:40
0

в таблице около миллиона записей. Я пробовал оба подхода.

Kazi Mohammad Ali Nur
2 июля 2021 в 04:51
0

Я только что протестировал таблицу с почти 100 миллионами строк, и это заняло почти три минуты. Я пересматриваю свой ответ, который будет намного быстрее, но требует дополнительной работы.