Итерация по списку строк в SQL и запуск SELECT для каждой строки - PullRequest
0 голосов
/ 18 марта 2020

Итак, у меня есть список из примерно 300 строк.

Я хотел бы пройти по этому списку и выполнить оператор SELECT для каждой строки.

Пример:

theList = ['account1', 'account2', 'account3']

for eachItem in theList:
   SELECT * from aTable where accountName = eachItem

Важное замечание: я не могу INSERT или CREATE таблицы в этой БД, так как это производственная база данных.

И список из 300 строк, является частью столбца accountName с 50 000 записей.

Это то, что я пытался, не мог понять, как заставить это работать:

DECLARE 
   theaccount varchar(100); 
BEGIN 
   FOR theaccount in ['account1','account2'] LOOP 

      (
      select * 
      from aTable
      where 
      accountName = theaccount

      ); 
  END LOOP; 
END; 

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Если вы получили конкатенацию строк, то следующий подход сделал бы то же самое вместо подхода row_by_row для циклического перемещения курсора.

Гораздо чище и эффективнее.

create table t(x int, y varchar2(30));

insert into t 
select level,to_char(level)
  from dual
connect by level<=20;

--Passing a list of varchar as '12','9','5'
select *
  from t
where y in (select * 
              from TABLE(sys.odcivarchar2List('12','9','5'))
            )  
0 голосов
/ 18 марта 2020

Ваш логин c выглядит так, что вам нужны все записи из aTable, чьи имена совпадают с вашим списком из 300 учетных записей. SQL настоятельно предпочитает использовать операции на основе множеств, поэтому простейшим решением будет просто загрузить эти 300 соответствующих имен учетных записей во временную таблицу, а затем выполнить следующий запрос:

SELECT *
FROM aTable t1
WHERE EXISTS (SELECT 1 FROM temp_accounts t2 WHERE t2.accountName t1.accountName);

См. здесь для получения дополнительной информации о создании временных таблиц. Обратите внимание, что в большинстве случаев использование временных таблиц вместо лучших параметров (таких как создание постоянных таблиц) является плохой практикой. Однако, учитывая, что эта временная таблица будет содержать только 300 единичных точек данных, она не должна сильно нагружать вашу производственную систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...