我陷入了一些糟糕的数据库设计中,我必须查询按日期命名的表。
当表名称与相关日期进行硬编码时,以下查询有效。
SELECT
ajob.ORDER_ID
, ajob.JOB_NAME
, abim.SERVICE_ID
, shist.SERVICE_NAME
FROM
obscuredschema.A190129001_AJOB ajob --hardcoded YYMMDD table name
INNER JOIN obscuredschema.A190129001_ABIMSVC abim --hardcoded YYMMDD table name
ON (ajob.ORDER_ID = abim.ORDER_ID)
INNER JOIN obscuredschema.SERVICE_HIST shist
ON (abim.SERVICE_ID = shist.SERVICE_KEY)
WHERE shist.SERVICE_NAME LIKE '%BIM'
AND shist.BIM_AUTH_ID > 0
;
记下两个硬编码的表名称(以及别名)
如何使用动态表名执行相同的查询?(有两个)
动态日期的代码:TO_CHAR(trunc(sysdate - 7), 'YYMMDD')
如果第一个表名称是字符串,那么我将如何构建它:'A'||TO_CHAR(trunc(sysdate - 7), 'YYMMDD')||'001_AJOB'
如果第二个表名称是字符串,那么我将如何构建它:'A'||TO_CHAR(trunc(sysdate - 7), 'YYMMDD')||'001_ABIMSVC'
我不认为你可以用动态表名编写简单的 SQL 查询。
您可以编写一个 PL/SQL 过程,其中使用execute immediate
并返回一个光标或其他东西;昨天有人问过这个问题 https://stackoverflow.com/questions/54520373/append-date-to-string-to-get-table-name-in-oracle-and-do-select-query-on-it。如果您只是尝试编写此查询来与某些数据交互,那么这可能是您最好的选择。
此外,您可以通过将 PL/SQL 过程转变为流水线函数 https://www.akadia.com/services/ora_pipe_functions.html,然后您可以使用 SQL 查询调用它TABLE()
.
如果是我,我会考虑创建一个同义词(或一个仅从动态命名表中选择的标准视图),并安排一个作业在每次创建新表时重新创建它。这可能比处理管道函数更简单。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)