Я искал и не нашел решения, касающегося множества столбцов для сравнения.
У меня есть 1 большая таблица (ruleTable) с ок.300 столбцов, 1723 строки и другая таблица (sampleTable) с 1 строкой и точно такими же столбцами.Я хочу написать процедуру (с двумя аргументами: sampleTable и ruleTable), сравнивающую эту строку из второй таблицы с каждой строкой из первой таблицы.
Желаемый результат - таблица с 1723 строками и 3 столбцами: RULE_ID, WRONG (количество столбцов с одинаковым значением), RIGHT ((количество столбцов с разными значениями)
До настоящего времениЯ написал процедуру (вы можете увидеть ее ниже), но она определенно медленная, и для ее завершения требуются годы. У кого-нибудь есть идеи, как улучшить этот подход (или, возможно, полностью изменить) и справиться с этой проблемой?самая большая проблема заключается в количестве столбцов ...
PROCEDURE MAKE_CLASSIFICATION(sampleTable VARCHAR2, ruleTable VARCHAR2) AS
l_query VARCHAR2(10000) := '';
l_rulesColumns TEXTLIST := GetFeatureColumnList(ruleTable);
l_rulesIDs TEXTLIST := GetTableColumnValues(ruleTable, 'ID');
rule_value NUMBER;
sample_value NUMBER;
right NUMBER := 0;
wrong NUMBER := 0;
BEGIN
FOR j IN 1..l_rulesIDs.count()
LOOP
FOR i IN 1..l_rulesColumns.count()
LOOP
l_query := 'SELECT ' || l_rulesColumns(i) || ' FROM ' || ruleTable || ' WHERE ID=' || l_rulesIDs(j);
EXECUTE IMMEDIATE l_query INTO rule_value;
l_query := 'SELECT ' || l_rulesColumns(i) || ' FROM ' || sampleTable || ' WHERE rownum=1';
EXECUTE IMMEDIATE l_query INTO sample_value;
IF(rule_value = sample_value) THEN right:=right+1;
ELSE wrong := wrong + 1;
END IF;
END LOOP;
DBMS_output.put_line('right: ' || right || '; wrong: ' || wrong );
wrong := 0;
right := 0;
END LOOP;
END;
тип TEXTLIST определяется глобально:
TYPE TEXTLIST IS VARRAY(1000000) OF VARCHAR2(10000);
GetFeatureColumnList -> эта функция возвращает TEXTLIST со списком имен таблиц colmun (без 'ID 'column)
GetTableColumnValues -> эта функция возвращает TEXTLIST со списком всех значений COLUMN (в нашем случае - столбца' ID ')
Заранее благодарим за помощь друзей.