Oracle - Как выбрать записи на основе приведенной ниже логики - PullRequest
2 голосов
/ 27 апреля 2011

у меня есть:

 Table A
 -------
 N0       Date        Time
 -----------------------------
 123    20-Apr-11      10:00:05
 123    20-Apr-11      10:00:06
 456    20-Apr-11      10:00:01
 456    20-Apr-11      10:00:02

 Table B
 -------
 N0       Date        Time
 -----------------------------
 123    20-Apr-11      10:00:02
 123    20-Apr-11      10:00:04
 123    20-Apr-11      10:00:05
 123    20-Apr-11      10:00:07
 123    20-Apr-11      10:00:08
 456    20-Apr-11      10:00:04
 456    20-Apr-11      10:00:05
 456    20-Apr-11      10:00:02
 456    20-Apr-11      10:00:03
 456    20-Apr-11      10:00:00

Желаемый результат

 A.N0     A.Date       A.Time     B.Time
 ----------------------------------------
 123    20-Apr-11      10:00:05  10:00:07   
 123    20-Apr-11      10:00:06  10:00:08
 456    20-Apr-11      10:00:01  10:00:03
 456    20-Apr-11      10:00:02  10:00:04

Примечание

Если вы видите результаты выше, B.time должно быть больше A.time и не должно повторяться в соединении.

Подскажите, пожалуйста, как это сделать с помощью оператора SQL оракула. ​​

Ответы [ 2 ]

0 голосов
/ 27 апреля 2011

Проверьте это

Но требуется создать один новый столбец с именем «Флаг» в таблице B

CREATE OR REPLACE PROCEDURE Proc_test
IS
BEGIN
   FOR i IN (SELECT   *
                 FROM a
             ORDER BY NAME, date, time)
   LOOP
      FOR j IN (SELECT   *
                    FROM b
                ORDER BY NAME, date, time)
      LOOP
         IF     i.NAME = j.NAME
            AND i.date = j.date
            AND j.flag IS NULL
            AND i.time < j.time
         THEN
            INSERT INTO target
                        (NAME, date, time1, time2
                        )
                 VALUES (i.NAME, i.date, i.time, j.time
                        );

            UPDATE b
               SET flag = 'Y'
             WHERE NAME = i.NAME AND date = i.date AND time = j.time;

            COMMIT;
         END IF;
      END LOOP;
   END LOOP;
END;
/

Работает нормально ....

0 голосов
/ 27 апреля 2011

Вот что даст вам запрошенный вывод:

With NumberedA As
    (
    Select *
        , Row_Number() Over ( Partition By N0, Date Order By Time ) Num
    From TableA
    )
    , NumberedB As
    (
    Select A.N0, A.Date
        , A.Time ATime
        , B.Time BTime
        , Row_Number() Over ( Partition By A.N0, A.Date, A.Time Order By B.Time ) Num
    From TableA A
        Join TableB B
            On B.N0 = A.N0
                And B.Date = A.Date
                And B.Time > A.Time
    )
Select A.N0, A.Date, A.Time, B.Time
From NumberedA A
    Join NumberedB B
        On B.N0 = A.N0
            And B.Date = A.Date
            And B.ATime = A.Time
            And B.Num = A.Num

Тем не менее, было бы полезно, если бы мы поняли обоснование вашего запроса.

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