首页 > 解决方案 > 多个位置的 SQL 输入提示和 JOIN 问题的值相同

问题描述

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

最大的问题是,如何让我的用户输入提示Enter_Start_Date每次Enter_End_Date只出现一次?(即开始:01-JAN-18 和结束:28-FEB-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_usedandh_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

嵌套连接需要发生什么,还是我做错了什么?

标签: sqloraclejoinuser-input

解决方案


您只将每个替换变量的第二个引用从&更改为&&。如果您更改所有这些,那么您只会被提示一次。(不知道为什么会这样,但 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,尽管我想用户可能会觉得很尴尬。(如果您愿意,这也可以让您使用日期文字作为奖励)。由于提示可以包含您期望的格式,他们至少知道他们应该输入什么,但他们仍然可能不喜欢它。


推荐阅读