выбрать подзапрос, используя данные из оператора выбора? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть две таблицы, headers и lines.Мне нужно извлечь batch_submission_date из таблицы заголовков, но иногда запрос для batch_id возвращает null для batch_submission_date, но также возвращает parent_batch_id, и если мы запросим THAT parent_batch_id как batch_id, то тогдаверните правильную дату batch_submission_date.

например,

SELECT t1.batch_id, 
    t1.parent_batch_id, 
    t2.batch_submission_date 
FROM db.headers t1, db.lines t2 
WHERE t1.batch_id = '12345';

output = 12345, 99999, null

Затем мы используем этот родительский batch_id в качестве batch_id:

SELECT t1.batch_id, 
    t1.parent_batch_id, 
    t2.batch_submission_date
FROM db.headers t1, db.lines t2
WHERE t1.batch_id = '99999';

and we get output = 99999,99999,'2018-01-01'

Поэтому я пытаюсь написать запрос, который сделает это для меня - каждый раз, когда batch_submission_date для batch_id имеет значение null, мы находим родительский batch_id этого batch_id и запрашиваем его вместо этого.

Это была моя идея - но япросто вернуть null как для bp_batch_submission_date, так и для new_submission_date.

SELECT
    t1.parent_id as parent_id,
    t1.BATCH_ID as bp_batch_id,
    t2.BATCH_LINE_NUMBER as bp_batch_li,
    t1.BATCH_SUBMISSION_DATE as bp_batch_submission_date,

    CASE 
        WHEN t1.BATCH_SUBMISSION_DATE is null
    THEN
        (SELECT a.BATCH_SUBMISSION_DATE 
        FROM 
        db.headers a,
        db.lines b 
        WHERE 
            a.SD_BATCH_HEADERS_SKEY = b.SD_BATCH_HEADERS_SKEY   
            and a.parent_batch_id = bp_batch_id
            and b.batch_line_number = bp_batch_li
        ) END as new_submission_date

FROM    
    db.headers t1,
    db.lines t2 
WHERE
    t1.SD_BATCH_HEADERS_SKEY = t2.SD_BATCH_HEADERS_SKEY   
    and (t1.BATCH_ID = '12345' or t1.PARENT_BATCH_ID = '12345') 
    and t2.BATCH_LINE_NUMBER = '1'              
GROUP BY
    t2.BATCH_CLAIM_LINE_STATUS_DESC,
    t1.PARENT_BATCH_ID,
    t1.BATCH_ID,
    t2.BATCH_LINE_NUMBER,
    t1.BATCH_SUBMISSION_DATE;

Возможно ли то, что я пытаюсь сделать?используя переменные bp_batch_id и bp_batch_li

1 Ответ

0 голосов
/ 06 февраля 2019

Используйте CTE (общее табличное выражение), чтобы избежать избыточного кода, затем используйте coalesce(), чтобы найти родительскую дату в случае нуля.В ваших первых запросах вы не добавляли условие соединения между двумя таблицами, я предполагал, что оно основано на sd_batch_headers_skey, как в предыдущем запросе.

dbfiddle demo

with t as (
    select h.batch_id, h.parent_batch_id, l.batch_submission_date bs_date
      from headers h
      join lines l on l.sd_batch_headers_skey = h.sd_batch_headers_skey 
                  and l.batch_line_number = '1' )
select batch_id, parent_batch_id, 
       coalesce(bs_date, (select bs_date from t x where x.batch_id = t.parent_batch_id)) bs_date
  from t 
  where batch_id = 12345;

Вы можете использовать более простой синтаксис с connect by и level <= 2, но если в ваших данных действительно есть строки, содержащие одинаковые идентификаторы (99999, 99999), тогда мы получимошибка цикла.

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