SQL输入提示的值相同,并在多个位置加入问题



我正在尝试为客户创建一个特定于他们当前需要的日期范围的报告,但是我有几个问题。

最大的一个是,如何使我的用户输入提示Enter_Start_DateEnter_End_Date仅出现一次?(即开始:1月1日至18日,结束:28-FEB-18)。我试图在这里研究其他问题,并且有一个建议(对该用户有用)做A&&在其他发生之前使用相同的变量名称,但是当我运行查询时,我仍然会提示4次。

我遇到的另一个"问题"是下面的查询并没有像应有的那样返回parts_usedh_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_usedh_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

是嵌套加入需要发生的事情,还是我在做一些问题?

您仅将第二个替换变量的第二个引用从 &更改为 &&。如果您更改所有这些,则只会提示每个人一次。(不确定为什么要这样做,但是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'" 

也可以定义变量,然后在引用它们时可以使用sing &或double &&(并且您可以使用较短的名称;当然可以使用您自己的提示文本)。

>

如果您还可以选择其他日期格式,那不依赖用户的会话日期语言(因为缩写依赖于NLS),最好使用4位年份,并且是明确的 - 所以也许是yyyy-mm-dd,而不是dd/mm/yyyy,尽管我想我觉得那个尴尬。(如果您愿意,这也可以让您将日期文字用作奖金)。由于提示可以包含您期望的格式,他们至少知道他们应该输入什么,但是他们仍然不喜欢它。

相关内容

  • 没有找到相关文章

最新更新