Упрощение SQL-запросов (ОБЪЯСНЯТЬ СТОИМОСТЬ 58) - PullRequest
0 голосов
/ 01 июня 2018

Может кто-нибудь помочь в упрощении запроса ниже.Стоимость его показывает как 58.

b.dueDate и b.tID являются составными ключами.a.tID - это первичный ключ и внешний ключ между таблицами 1 и 2.

SELECT test.tID, test.sor_acct_id, test.pmt, test.status FROM   ct.tab1 a, 
   (SELECT a.tID, a.sor_acct_id, b.dueDate, b.amt, b.status, a.pmt, 
           Row_number() OVER ( partition BY a.tID ORDER BY b.dueDate DESC) AS rn 
    FROM   ct.tab1 a 
           INNER JOIN ct.tab2 b 
                   ON a.tID = b.tID 
    WHERE  a.tID IN (SELECT a.tID 
                              FROM   ct.tab1 a 
                                     INNER JOIN 
                                     ct.tab2 b 
                                             ON a.tID = 
                                                b.tID 
                              WHERE  a.status = 'E' 
                                     AND a.pmt IS NOT NULL 
                                     AND a.pmt <> '{}' 
                                     AND b.dueDate > CURRENT_DATE - 4 
                                     AND b.dueDate < CURRENT_DATE) 
           AND b.dueDate > CURRENT_DATE - 1 
   ) test WHERE  rn = 1 
   AND test.status IN ( 'X', 'Z' ) 
   AND a.tID = test.tID

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

tID является первичным ключом tab1.Поэтому, когда вы говорите, что ищете tab1 записей, tID которых находится в наборе tab1 записей со статусом E, вы можете просто сказать: я ищу tab1 записей сстатус E.

Что делает ваш запрос: Показать все tab1 записей с их окончательным tab2 предоставленным статусом ...

  • tab1 pmt не равно NULL ине '{}'
  • tab1 статус E
  • конечный tab2 статус X или Z
  • окончательный tab2 статус должен быть сегодня илив будущем
  • существует как минимум одна запись tab2, которая должна быть сделана за последние три дня для записи tab1

Запрос:

SELECT
  t1.tID,
  t1.sor_acct_id,
  t1.pmt,
  t2.status
FROM ct.tab1 t1
join
(
  SELECT
    tID,
    status,
    ROW_NUMBER() OVER (PARTITION BY tID ORDER BY dueDate DESC) AS rn
  FROM ct.tab2
  WHERE dueDate > CURRENT_DATE - 1
) t2 ON  t2.tID = tab1.tID AND t2.rn = 1 AND t2.status IN ('X', 'Z') 
WHERE t1.status = 'E'
  AND t1.pmt IS NOT NULL
  AND t1.pmt <> '{}'
  and t1.tID IN
  (
    SELECT tID
    FROM ct.tab2
    WHERE dueDate > CURRENT_DATE - 4
      AND dueDate < CURRENT_DATE
  );
0 голосов
/ 01 июня 2018

Может быть, вы измените:

WHERE  a.tID IN (SELECT a.tID ....

на:

join ((SELECT a.tID FROM   ct.tab1 a ....) t on t.tID=a.tID
...