Идентификация записей транзитивного соответствия в oracle SQL

#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