#sql #oracle
#sql #Oracle
Вопрос:
Сценарий 1 :-
Косвенно объекты rowid 3 и 4, которые принадлежат одному и тому же источнику A, объединяются.
Rowid_object Rowid_object_source Rowid_object_matched Rowid_object_matched_Source
2 X 3 A
2 X 4 A
1 Y 2 X
нам нужно идентифицировать записи такого типа и удалить одну
Сценарий 2 :-
Косвенно rowid_object 2 и 4, которые принадлежат одному и тому же источнику A, собираются вместе.
Rowid_object Rowid_object_source Rowid_object_matched Rowid_object_matched_Source
1 X 2 A
2 A 3 Y
3 Y 1 X
4 A 3 Y
нам нужно идентифицировать записи такого типа и удалить одну
Я пытался использовать connect_by ранее, но не смог его получить. Пожалуйста, дайте мне знать, как мы можем достичь этого с помощью Oracle SQL.
Комментарии:
1. Я попробовал этот sql SELECT ROWID_OBJECT_MATCHED «ROWID_OBJECT_MATCHED», CONNECT_BY_ROOT ROWID_OBJECT_MATCHED «ROWID_OBJECT», LEVEL-1 «Pathlen», SYS_CONNECT_BY_PATH(ROWID_OBJECT_MATCHED, ‘/’) «Путь» Из таблицы, ГДЕ LEVEL > 1 и rowid_object_matched = ‘value’ и trunc(create_date) = trunc( sysdate) ПОДКЛЮЧЕНИЕ ЗА один ЦИКЛ до rowid_object_matched = rowid_object
Ответ №1:
В приведенном ниже примере sourcetable просто настраивает данные, как в вашем первом примере. В BSET мы добавляем столбец keep_only_1, который является счетчиком похожих записей. В качестве последнего шага мы сохраняем только запись, где keep_only_1 = 1. Я оставляю вам использовать этот метод для решения вашего второго вопроса. Поскольку это полностью автономно, вы можете скопировать и вставить его в SQL * Plus, чтобы увидеть результаты.
WITH
sourcetable AS
(SELECT 2 AS rowid_object
, 'X' AS rowid_object_source
, 3 AS rowid_object_matched
, 'A' AS rowid_object_matched_source
FROM DUAL
UNION ALL
SELECT 2, 'X', 4, 'A' FROM DUAL
UNION ALL
SELECT 1, 'Y', 2, 'X' FROM DUAL),
bset AS
(SELECT rowid_object
, rowid_object_source
, rowid_object_matched
, rowid_object_matched_source
, ROW_NUMBER( )
OVER( PARTITION BY rowid_object
, rowid_object_source
, rowid_object_matched_source
ORDER BY rowid_object_matched ) AS keep_only_1
FROM sourcetable)
SELECT rowid_object
, rowid_object_source
, rowid_object_matched
, rowid_object_matched_source
FROM bset
WHERE keep_only_1 = 1;
Комментарии:
1. Пробовал с несколькими сценариями, я вижу, что этот SQL выдает мои записи на основе раздела rownumber. В определенном смысле это выбор другого сценария, скажем, Rowid_object Rowid_object_source Rowid_object_matched rowid_object_matched_source 1 B 3 A 2 C 3 A