Как получить объемные данные в Oracle? - PullRequest
0 голосов
/ 02 мая 2018

Существует одна таблица с именем PROFIT, которая содержит все данные о прибыли для компании. Эта таблица содержит более 5 миллионов данных. Структура таблицы выглядит следующим образом

COMPANYID   YEAR    PROFIT
   100001   2017     50000
   100001   2016     30000
   100001   2015     20000
   100002   2017     80000
   100002   2016     70000
   100002   2015     40000
   100003   2016    100000
   100003   2015     75000
   100004   2017     50000
   100004   2016     40000
   100004   2015     30000
   100004   2014     10000
   100004   2013      5000

У меня есть список Excel 75000 companyid, и мне нужно получить данные для всех этих компаний. Я не могу использовать IN, потому что он допускает только 999 значений в списке одновременно.

Пожалуйста, помогите мне. Как я могу получить все эти записи, используя один запрос? В настоящее время я использую Oracle 11g.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Предполагая ...

  • вы просто хотите запустить оператор SQL
  • электронная таблица - это просто список идентификаторов

... вы можете подготовить такой сценарий.

  1. Сохранить таблицу Excel как .csv
  2. Открыть .csv файл в текстовом редакторе, который поддерживает регулярные выражения
  3. Используйте шаблоны регулярных выражений, чтобы превратить каждое число в оператор выбора: select \1 as co_id from dual union all
  4. Верхний и конечный вывод для создания подзапроса предложения with
  5. Присоедините это к вашей таблице прибыли

Так что теперь у вас есть что-то вроде этого:

with cte as (
    select 1 as co_id from dual union all
    select 2 as co_id from dual union all
    ....
    select 75000 as co_id from dual 
) 
select p.companyid
       , p.year
       , sum(p.profit) as annual_profit -- or whatever
from cte
     join profit p
       on cte.co_id = p.companyid
group by p.companyid
         , p.year

Это не динамическое решение, но статический скрипт должен подойти для одноразового упражнения. Если это будет регулярный отчет, вы должны договориться о праве вносить изменения в производство, чтобы вы могли поддержать лучший подход.

0 голосов
/ 02 мая 2018

Я надеюсь, что вы можете запустить код PL / SQL в вашей производственной среде. Затем вы можете попробовать приведенный ниже код, который принимает до 4 ГБ строки и возвращает в виде строк после применения сплиттера.

Поскольку у вас есть строки в Excel, вы можете скопировать все строки с пост-суффиксом ",", а затем удалить новую строку, чтобы она стала вашим входным параметром. И передайте все эти значения в одиночной квоте или разделителе строк, как я передал в примере кода ниже.

Затем вы можете передать свою таблицу для предложения IN, как я передал здесь в "test_2", фиктивной таблице.

declare
v_input_str clob := '100002,100003,100004,100005,100006,100007,100008,100009,100010,100011,100012,100013,100014,100015,100016,100017,100018,100019,100020,100021,100022,100023,100024,100025,100026,100027,100028,100029,100030,100031,100032,100033,100034,100035,100036,100037,100038,100039,100040,100041,100042,100043,100044,100045,100046,100047,100048,100049,100050,100051,100052,100053,100054,100055,100056,100057,100058,100059,100060,100061,100062,100063,100064,100065,100066,100067,100068,100069,100070,100071,100072,100073,100074,100075,100076,100077,100078,100079,100080,100081,100082,100083,100084,100085,100086,100087,100088,100089,100090,100091,100092,100093,100094,100095,100096,100097,100098,100099,100100,100101,100102,100103,100104,100105,100106,100107,100108,100109,100110,100111,100112,100113,100114,100115,100116,100117,100118,100119,100120,100121,100122,100123,100124,100125,100126,100127,100128,100129,100130,100131,100132,100133,100134,100135,100136,100137,100138,100139,100140,100141,100142,100143,100144,100145,100146,100147,100148,100149,100150,100151,100152,100153,100154,100155,100156,100157,100158,100159,100160,100161,100162,100163,100164,100165,100166,100167,100168,100169,100170,100171,100172,100173,100174,100175,100176,100177,100178,100179,100180,100181,100182,100183,100184,100185,100186,100187,100188,100189,100190,100191,100192,100193,100194,100195,100196,100197,100198,100199,100200,100201,100202,100203,100204,100205,100206,100207,100208,100209,100210,100211,100212,100213,100214,100215,100216,100217,100218,100219,100220,100221,100222,100223,100224,100225,100226,100227,100228,100229,100230,100231,100232,100233,100234,100235,100236,100237,100238,100239,100240,100241,100242,100243,100244,100245,100246,100247,100248,100249,100250,100251,100252,100253,100254,100255,100256,100257,100258,100259,100260,100261,100262,100263,100264,100265,100266,100267,100268,100269,100270,100271,100272,100273,100274,100275,100276,100277,100278,100279,100280,100281,100282,100283,100284,100285,100286,100287,100288,100289,100290,100291,100292,100293,100294,100295,100296,100297,100298,100299,100300,100301,100302,100303,100304,100305,100306,100307,100308,100309,100310,100311,100312,100313,100314,100315,100316,100317,100318,100319,100320,100321,100322,100323,100324,100325,100326,100327,100328,100329,100330,100331,100332,100333,100334,100335,100336,100337,100338,100339,100340,100341,100342,100343,100344,100345,100346,100347,100348,100349,100350,100351,100352,100353,100354,100355,100356,100357,100358,100359,100360,100361,100362,100363,100364,100365,100366,100367,100368,100369,100370,100371,100372,100373,100374,100375,100376,100377,100378,100379,100380,100381,100382,100383,100384,100385,100386,100387,100388,100389,100390,100391,100392,100393,100394,100395,100396,100397,100398,100399,100400,100401,100402,100403,100404,100405,100406,100407,100408,100409,100410,100411,100412,100413,100414,100415,100416,100417,100418,100419,100420,100421,100422,100423,100424,100425,100426,100427,100428,100429,100430,100431,100432,100433,100434,100435,100436,100437,100438,100439,100440,100441,100442,100443,100444,100445,100446,100447,100448,100449,100450,100451,100452,100453,100454,100455,100456,100457,100458,100459,100460,100461,100462,100463,100464,100465,100466,100467,100468,100469,100470,100471,100472,100473,100474,100475,100476,100477,100478,100479,100480,100481,100482,100483,100484,100485,100486,100487,100488,100489,100490,100491,100492,100493,100494,100495,100496,100497,100498,100499,100500,100501,100502,100503,100504,100505,100506,100507,100508,100509,100510,100511,100512,100513,100514,100515,100516,100517,100518,100519,100520,100521,100522,100523,100524,100525,100526,100527,100528,100529,100530,100531,100532,100533,100534,100535,100536,100537,100538,100539,100540,100541,100542,100543,100544,100545,100546,100547,100548,100549,100550,100551,100552,100553,100554,100555,100556,100557,100558,100559,100560,100561,100562,100563,100564,100565,100566,100567,100568,100569,100570,100571,100572,100573';
v_count number;
begin

select count(1) into v_count
from test_2 
where id in (with i as (select v_input_str as str from dual)
                select to_number(regexp_substr(str, '[^,]+', 1, level)) in_clause_values
                from i connect by level <= length(regexp_replace(str, '[^,]+')) + 1
            );

dbms_output.put_line('No of elements : '||v_count);

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