Одинаковое значение для подсказки ввода SQL в нескольких местах и ​​проблема JOIN - PullRequest
0 голосов
/ 27 февраля 2019

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

Самый большой из них,Как я могу получить мои пользовательские запросы на ввод Enter_Start_Date и Enter_End_Date только один раз?(то есть Начало: 01 января 18 и Конец 28 февраля 18).Я попытался исследовать другие вопросы здесь, и было предложение (которое сработало для этого пользователя) сделать && с тем же именем переменной перед дополнительными вхождениями, но когда я запускаю запрос, мне все равно предлагается 4 раза.

Другая проблема, с которой я столкнулся, заключается в том, что приведенный ниже запрос не возвращает результаты для parts_used и h_repairs, как это должно быть.

SELECT
    a.h_desc,
    a.fic,
    a.p_part,
    a.d_part,
    a.nomenclature,
    a.qpe,
    SUM(b.qty) AS parts_used,
    COUNT(c.fic) AS h_repairs,
    a.cdf_ohb,
    a.bmc
FROM
    t_table_a a
    LEFT JOIN t_table_b b ON b.fic = a.fic
                                   AND b.part_no = a.d_part
                                   AND b.real_f_date BETWEEN TO_DATE('&Enter_Start_Date', 'DD-MON-YY') AND TO_DATE('&Enter_End_Date'
                                   , 'DD-MON-YY')
    LEFT JOIN t_table_c c ON c.fic = a.fic
                             AND c.real_f_date BETWEEN TO_DATE('&&Enter_Start_Date', 'DD-MON-YY') AND TO_DATE('&&Enter_End_Date',
                             'DD-MON-YY')
GROUP BY
    a.bmc,
    a.cdf_ohb,
    a.d_part,
    a.fic,
    a.h_desc,
    a.nomenclature,
    a.p_part,
    a.qpe
ORDER BY
    a.fic,
    a.p_part

Когда я выполняю приведенный выше запрос, столбцы parts_used и h_repairs полностью не в порядке, но когда я вкладываю объединения, как в приведенном ниже запросе, результаты заполняются, как и ожидалось.

SELECT
    t.h_desc,
    t.fic,
    t.p_part,
    t.d_part,
    t.nomenclature,
    t.qpe,
    COUNT(c.fic) AS h_repairs,
    t.parts_used,
    t.cdf_ohb,
    t.bmc
FROM
    (
        SELECT
            a.h_desc,
            a.fic,
            a.p_part,
            a.d_part,
            a.nomenclature,
            a.qpe,
            SUM(b.qty) AS parts_used,
            a.cdf_ohb,
            a.bmc
        FROM
            t_table_a a
            LEFT JOIN t_table_b b ON b.fic = a.fic
                                     AND b.part_no = a.d_part
                                     AND b.real_f_date BETWEEN TO_DATE('&Enter_Start_Date', 'DD-MON-YY') AND TO_DATE('&Enter_End_Date'
                                     , 'DD-MON-YY')
        GROUP BY
            a.bmc,
            a.cdf_ohb,
            a.d_part,
            a.fic,
            a.h_desc,
            a.nomenclature,
            a.p_part,
            a.qpe
    ) t
    LEFT JOIN t_table_c c ON c.fic = t.fic
                             AND c.real_f_date BETWEEN TO_DATE('&&Enter_Start_Date', 'DD-MON-YY') AND TO_DATE('&&Enter_End_Date',
                             'DD-MON-YY')
GROUP BY
    t.h_desc,
    t.fic,
    t.p_part,
    t.d_part,
    t.nomenclature,
    t.qpe,
    t.parts_used,
    t.cdf_ohb,
    t.bmc
ORDER BY
    t.fic,
    t.p_part

Является ли вложение соединений тем, что должно произойти, или я что-то делаю немного неправильно?

1 Ответ

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

Вы изменили только вторую ссылку на каждую переменную подстановки с & на &&.Если вы измените их все, вам будет предложено только один раз для каждого.(Не уверен, почему это так, но SQL * Plus делает то же самое).

Вы также можете запросить более приятное сообщение, добавив в ваш скрипт следующие операторы перед вашим запросом:

accept Enter_Start_Date date format "DD-MON-YY" prompt "Enter the start date in the format 'DD-MON-YY'" 
accept Enter_End_Date date format "DD-MON-YY" prompt "Enter the end date in the format 'DD-MON-YY'" 

Поскольку это также определяет переменные, вы можете использовать либо синг &, либо двойной && при обращении к ним (и вы можете использовать более короткие имена; и, конечно же, свой собственный текст подсказки).


Если вы можете, я бы также предложил вам выбрать другой формат даты, который не зависит от языка даты сеанса пользователя (поскольку сокращения месяца зависят от NLS), предпочтительно с использованием четырехзначных лет,и что однозначно - так что, может быть, ГГГГ-ММ-ДД вместо ДД / ММ / ГГГГ, хотя пользователи могут посчитать это неловким, я полагаю.(Это также позволит вам использовать литералы даты в качестве бонуса, если вы хотите).Поскольку подсказка может содержать формат, который вы ожидаете, они, по крайней мере, знают, что им следует ввести, но им все равно может не понравиться.

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