2016-03-03 5 views
-1

Следующие критерии составляют 75% от того, что мне нужно. Он возвращает сотрудников с двумя или более записями, одним из которых является статус «R» (TBL A), и один из которых не является статусом не в «a», «r» (TBL B).цикл через несколько записей

Каков наилучший способ прохождения через TBL B, если количество записей в этой таблице для данного сотрудника неизвестно?

SELECT DISTINCT A.EMPLID, A.EMPL_RCD, B.EMPL_RCD 
FROM TBL A, TBL B 
WHERE A.EMPLID = B.EMPLID 
    AND A.EMPL_RCD != B.EMPL_RCD 
    AND A.STATUS != 'A' 
    AND B.STATUS = 'R' 
+4

Пожалуйста, объясните, что вы подразумеваете под «loop through» TBL B'. Это не похоже на что-то сделанное с запросом. –

+0

Также объясните, «один из которых * не * статус * не * в 'a', 'r' (TBL B)", поскольку он не соответствует запросу в вашем вопросе. –

+1

Примерные данные и ожидаемый результат, вероятно, многое помогут здесь. http://stackoverflow.com/help/how-to-ask –

ответ

1

Это получит EMPL_REC S с R статуса и соответствующего EMPL_REC со статусом, который не A или R и будет делать это в одной таблице сканирования (т.е. без соединения):

SELECT EMPLID, 
     R_EMPL_RCD, 
     NOT_R_EMPL_RCD 
FROM (
    SELECT EMPLID, 
     EMPL_RCD AS R_EMPL_RCD, 
     COALESCE(
      LAG(CASE STATUS WHEN 'R' THEN NULL ELSE EMPL_RCD END) 
      IGNORE NULLS OVER (PARTITION BY EMPLID ORDER BY ROWID), 
      LEAD(CASE STATUS WHEN 'R' THEN NULL ELSE EMPL_RCD END) 
      IGNORE NULLS OVER (PARTITION BY EMPLID ORDER BY ROWID) 
     ) AS NOT_R_EMPL_RCD, 
     STATUS 
    FROM TBL 
    WHERE STATUS <> 'A' 
) 
WHERE STATUS = 'R' 
AND NOT_R_EMPL_RCD IS NOT NULL; 
Смежные вопросы