Количество запросов Строка Присоединиться к Oracle - PullRequest
0 голосов
/ 05 декабря 2018

Я изо всех сил пытался выполнить этот запрос, вот что мне нужно / нужно:

Две таблицы, Таблица A и Таблица B, для каждой строки в таблице A может быть N строк в таблицеB. Но мне нужно найти строки из A, которые имеют ровно две строки в B, где одна из них тип (столбец в B) начинается с 'PYT', а другая имеет нулевой столбец, также мне нужно количество из таблицыB, чтобы быть из последней строки (DATEP в таблице B) Я пытался это сделать, но я обнаружил некоторые проблемы, это то, что у меня до сих пор:

SELECT
    A.TYPE, A.NMRAD,A.ID,  B.AMOUNT
FROM
    TABLE_A A
    JOIN TABLE_B B ON A.ID = B.ID_A    AND A.NMRAD = B.NMRAD  AND A.TYPE = B.TYPE
WHERE
    (SELECT COUNT(1) FROM (SELECT 1 FROM TABLE_B WHERE ID_A = A.ID AND TYPE LIKE 'PYT%'
    UNION 
    SELECT 1 FROM TABLE_B WHERE ID_A = A.ID AND B.TYPEPROCESS IS NOT NULL))=2
    WHERE A.TYPE=?

Например:

Table A
ID   | NMRAD  | TYPE 
1    |   2    |  PYT1
2    |   14   |  PYT2
5    |   11   |  PYY2

TABLE B
ID_A | NMRAD | TYPE | TYPEPROCESS | AMOUNT | DATEP
1    |  2    | PTY1 | NULL        |  50    | 18/10/2018
1    |  2    | PYY2 | 123         |  35    | 19/10/2018
2    |  14   | PTY2 | NULL        |  50    | 18/09/2018
2    |  14   | PTY2 | NULL        |  35    | 17/10/2018
2    |  14   | PTY3 | NULL        |  77    | 11/07/2018

EXPECTED RESULT

TYPE | NMRAD | ID | AMOUNT 
PTY1 | 2     | 1  |  35

1 Ответ

0 голосов
/ 06 декабря 2018

Я не могу соответствовать вашим критериям «ровно две строки», но вот SQL, который соответствует вашим ожидаемым результатам:

WITH
    aset AS
        (SELECT a.*
           FROM tablea a
          WHERE     EXISTS
                        (SELECT NULL
                           FROM tableb b
                          WHERE     a.id = b.id
                                AND a.nmrad = b.nmrad
                                AND a.TYPE = b.TYPE
                                AND b.TYPE LIKE 'PTY%')
                AND EXISTS
                        (SELECT NULL
                           FROM tableb b
                          WHERE     a.id = b.id
                                AND a.nmrad = b.nmrad
                                AND a.TYPE = b.TYPE
                                AND b.typeprocess IS NULL))
SELECT a.*
     , (SELECT amount
          FROM tableb b
         WHERE     a.id = b.id
               AND a.nmrad = b.nmrad
               AND datep = (SELECT MAX( datep )
                              FROM tableb bb
                             WHERE b.id = bb.id AND b.nmrad = bb.nmrad))    amount
  FROM aset a;

Это привело к:

ID     NMRAD     TYPE     AMOUNT
 1         2     PTY1         35

Упростить этодля нас, чтобы помочь вам, в следующий раз включите настройку:

CREATE TABLE tablea
(
    id       NUMBER( 3 )
  , nmrad    NUMBER( 2 )
  , TYPE     VARCHAR2( 4 )
);

CREATE TABLE tableb
(
    id             NUMBER( 3 )
  , nmrad          NUMBER( 2 )
  , TYPE           VARCHAR2( 4 )
  , typeprocess    NUMBER( 3 )
  , amount         NUMBER( 3 )
  , datep          DATE
);

begin
  insert into tablea values (1,   2,  'PTY1');
  insert into tablea values (2,   14,  'PTY1');
  insert into tablea values (5,   11,  'PTY1');

  insert into tableb values (1,  2, 'PTY1', NULL,  50, to_date('18/10/2018', 'DD/MM/YYYY'));
  insert into tableb values (1,  2, 'PYY2', 123,   35, to_date('19/10/2018', 'DD/MM/YYYY'));
  insert into tableb values (2,  14, 'PTY2', NULL, 50, to_date('18/09/2018', 'DD/MM/YYYY'));
  insert into tableb values (2,  14, 'PTY2', NULL, 35, to_date('17/10/2018', 'DD/MM/YYYY'));
  insert into tableb values (2,  14, 'PTY3', NULL, 77, to_date('11/07/2018', 'DD/MM/YYYY'));
  commit;
end;
...