Нужен SQL-запрос для сценария ниже - PullRequest
0 голосов
/ 13 июня 2019

Мне нужно составить SQL-запрос, который будет извлекать максимальный столбец «seq» из таблицы1, если соответствующий столбец «seq» не имеет «C» в столбце «Res» в таблице2

Сценарий: 1

Table 1
+----+---------+
| Seq | Req    | 
+----+---------+
| 001 | X1     |
| 002 | X1     |
| 003 | X1     |
+----+---------+

Table2
+----+---------+--------+
|Seq | Req     | Res    | 
+----+---------+--------+
| 001| X1     |   D     | 
| 002| X1     |   D     |
| 003| X1     |   C     |
+----+---------+--------+

вывод: поскольку максимальное значение seq (003) имеет «C» в Res, я не хочу отображать здесь какие-либо записи

Сценарий: 2

Table 1
+----+---------+
| Seq | Req    | 
+----+---------+
| 001 | X1     |
| 002 | X1     |
| 003 | X1     |
| 004 | X1     |
+----+---------+

Table2
+----+---------+--------+
|Seq | Req     | Res    | 
+----+---------+--------+
| 001| X1     |   D     | 
| 002| X1     |   D     |
| 003| X1     |   C     |
+----+---------+--------+

вывод: я хочу отобразить запись "004, X1" из таблицы 1, так как в столбце Res нет значения "C" для максимального значения seq (004) в таблице 2 (нет)запись существует в Таблице 2 для максимальной последовательности - 004

Сценарий: 3

Table 1
+----+---------+
| Seq | Req    | 
+----+---------+
| 001 | X1     |
| 002 | X1     |
| 003 | X1     |
| 004 | X1     |
+----+---------+

Table2
+----+---------+--------+
|Seq | Req     | Res    | 
+----+---------+--------+
| 001| X1     |   D     | 
| 002| X1     |   D     |
| 003| X1     |   C     |
| 004| X1     |   K     |
+----+---------+--------+

Вывод: я хочу отобразить запись "004, X1" из Таблицы-1 какв столбце Res нет значения «C» для максимального значения seq (004) в таблице 2. Номер Max Seq в таблице 2 (004) равен K

Пробуется с внутренним соединением и левым соединением, но один или другой сценарий завершается ошибкой.Пожалуйста, помогите мне с этим

Ответы [ 3 ]

1 голос
/ 13 июня 2019

попробуйте ниже

with cte as
(
 select *,row_number() over(order by seq desc) rn
 from table1
)    
select cte.* 
from cte left join table2 t2 on cte.seq=t2.seq
where t2.res<>'C' and cte.rn=1
1 голос
/ 13 июня 2019

Установка Oracle :

CREATE TABLE Table1 (SEQ, REQ) AS
  SELECT '001', 'X1' FROM DUAL UNION ALL
  SELECT '002', 'X1' FROM DUAL UNION ALL
  SELECT '003', 'X1' FROM DUAL UNION ALL
  SELECT '004', 'X1' FROM DUAL UNION ALL

  SELECT '001', 'X2' FROM DUAL UNION ALL
  SELECT '002', 'X2' FROM DUAL UNION ALL
  SELECT '003', 'X2' FROM DUAL UNION ALL

  SELECT '001', 'X3' FROM DUAL UNION ALL
  SELECT '002', 'X3' FROM DUAL UNION ALL
  SELECT '003', 'X3' FROM DUAL UNION ALL
  SELECT '004', 'X3' FROM DUAL UNION ALL

  SELECT '001', 'X4' FROM DUAL UNION ALL
  SELECT '002', 'X4' FROM DUAL UNION ALL
  SELECT '003', 'X4' FROM DUAL UNION ALL
  SELECT '004', 'X4' FROM DUAL;

CREATE TABLE Table2 (SEQ, REQ, RES) AS
  SELECT '001', 'X1', 'D' FROM DUAL UNION ALL
  SELECT '002', 'X1', 'D' FROM DUAL UNION ALL
  SELECT '003', 'X1', 'K' FROM DUAL UNION ALL
  SELECT '004', 'X1', 'C' FROM DUAL UNION ALL

  SELECT '001', 'X2', 'D' FROM DUAL UNION ALL
  SELECT '002', 'X2', 'D' FROM DUAL UNION ALL
  SELECT '003', 'X2', 'C' FROM DUAL UNION ALL

  SELECT '001', 'X3', 'D' FROM DUAL UNION ALL
  SELECT '002', 'X3', 'D' FROM DUAL UNION ALL
  SELECT '003', 'X3', 'C' FROM DUAL UNION ALL
  SELECT '004', 'X3', 'K' FROM DUAL UNION ALL

  SELECT '001', 'X4', 'D' FROM DUAL UNION ALL
  SELECT '002', 'X4', 'D' FROM DUAL UNION ALL
  SELECT '003', 'X4', 'C' FROM DUAL;

Запрос

SELECT SEQ, REQ
FROM   (
  SELECT t1.*,
         MAX( t1.SEQ ) OVER ( PARTITION BY t1.REQ ) AS max_seq,
         MAX( t2.RES ) KEEP ( DENSE_RANK LAST ORDER BY t1.SEQ )
                       OVER ( PARTITION BY t1.REQ ) AS max_res
  FROM   table1 t1
         LEFT OUTER JOIN table2 t2
         ON ( t1.seq = t2.seq AND t1.req = t2.req )
)
WHERE  SEQ = max_seq
AND    max_res = 'C'

Выход

SEQ | REQ
:-- | :--
004 | X1 
003 | X2 

дБ <> скрипка здесь

0 голосов
/ 13 июня 2019

Это может немного отличаться в Oracle SQL

SELECT seq, req 
    FROM table1 
    WHERE seq in (SELECT max(seq) FROM table1) 
        AND seq NOT IN (SELECT seq FROM table2 WHERE res = 'C')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...