sql - 多个位置的 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_used
andh_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,尽管我想用户可能会觉得很尴尬。(如果您愿意,这也可以让您使用日期文字作为奖励)。由于提示可以包含您期望的格式,他们至少知道他们应该输入什么,但他们仍然可能不喜欢它。
推荐阅读
- c# - 在 Core 2.1 中向现有的 Microsoft.Extensions.Logging.LoggerExtensions 添加方法
- api - 谷歌地理编码 API 返回错误的邮编/城市
- java - 在旋转和阻塞时间短或没有旋转和阻塞时间的安全点操作期间,什么可能导致非常高的同步时间?
- c - 传递参数以更改 #define 变量
- ruby-on-rails - 虾 PDF 导致 heroku rails 应用程序中的内存膨胀
- php - 如果序列化失败,PHP 重试 PDO 执行:1213 尝试获取锁时发现死锁
- caching - NHibernate 二级缓存:查询缓存无法按预期工作
- build - 如何以角度更改构建项目的路径?
- python - 如何解决“变量在检查点可用,但与模型变量的形状不兼容”?
- java - JSP 没有为 HTML 表单 POST 显示正确的 UTF-8 内容