union一例,oracle上的union会自动把重复的列去掉

本文提供了一段SQL查询代码,用于查找税务稽查过程中因各种原因导致延期的案件。通过不同的角色(选案人员、检查人员、审理人员、执行人员)筛选出未按时完成的案件,并确保这些案件处于各自的工作流程阶段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[code]
--当该人是选案人员时
select qt.ajbh, qt.lrajbh, nsr.nsrsbh, nsr.nsrmc, jg.swjg_mc, zt.jczt_mc, qt.sfla
from
ctais2wg.t03_qtajxx qt
,ctais2wg.t03_ayxsqc ay
,ctais2wg.dm_jczt zt
,ctais2wg.dj_nsrxx nsr
,ctais2wg.dm_swjg jg
where
qt.AYXSCLR_DM = '14401000192' --该人是选案经办人
and qt.AJZXWBRQ is null --该案件没有执行完毕
and (sysdate - qt.ZGAJWCRQ) > 25 --已经超出原定完成日期特定的天数
and (
qt.AYCLRQ is not null and qt.JCRWXDRQ is null
) --该案件仍然在选案环节没有做完
and qt.ajbh = ay.ajbh
and qt.jczt_dm = zt.jczt_dm
and ay.LRDW_BM = jg.swjg_dm
and ay.nsrsbh = nsr.nsrsbh
union
--当该人是检查人员时
select qt.ajbh, qt.lrajbh, nsr.nsrsbh, nsr.nsrmc, jg.swjg_mc, zt.jczt_mc, qt.sfla
from
ctais2wg.t03_qtaj_jcry jcr
,ctais2wg.t03_qtajxx qt
,ctais2wg.t03_ayxsqc ay
,ctais2wg.dm_jczt zt
,ctais2wg.dj_nsrxx nsr
,ctais2wg.dm_swjg jg
where
jcr.jcry_dm = '14401000192' --该人负责检查环节
and jcr.yxbz = 'Y'
and jcr.ajbh = qt.ajbh --该人负责的检查环节中包含该案件的检查环节
and qt.AJZXWBRQ is null --该案件没有执行完毕
and (sysdate - qt.ZGAJWCRQ) > 25 --已经超出原定完成日期特定的天数
and (
(qt.sfla='Y' and qt.JCRWXDRQ is not null and qt.TJSLSRQ is null)
or
(qt.sfla='N' and qt.JCRWXDRQ is not null and qt.CLJDSFSRQ is null and qt.JCJLFSRQ is null)
) --该案件的检查环节仍然没有做完
--and qt.JCRWXDRQ is not null and qt.TJSLSRQ is null and qt.CLJDSFSRQ is null and qt.JCJLFSRQ is null --考虑到速度问题时可以用这条代替‘检查环节没完成’的功能
and qt.ajbh = ay.ajbh
and qt.jczt_dm = zt.jczt_dm
and ay.LRDW_BM = jg.swjg_dm
and ay.nsrsbh = nsr.nsrsbh
union
--当该人是审理人员时
select qt.ajbh, qt.lrajbh, nsr.nsrsbh, nsr.nsrmc, jg.swjg_mc, zt.jczt_mc, qt.sfla
from
ctais2wg.t03_qtaj_slry slr
,ctais2wg.t03_qtajxx qt
,ctais2wg.t03_ayxsqc ay
,ctais2wg.dm_jczt zt
,ctais2wg.dj_nsrxx nsr
,ctais2wg.dm_swjg jg
where
slr.slry_dm = '14401000192' --该人负责审理环节
and slr.yxbz = 'Y'
and slr.ajbh = qt.ajbh --该人负责的审理环节中包含该案件的检查环节
and qt.AJZXWBRQ is null --该案件没有执行完毕
and (sysdate - qt.ZGAJWCRQ) > 25 --已经超出原定完成日期特定的天数
and (
(qt.sfla='Y' and qt.TJSLSRQ is not null
and qt.CLJDSFSRQ is null and qt.JCJLFSRQ is null --非重大审
and qt.ZDSWASLTQSRQ is null) --重大审
) --该案件的审理环节仍然没有做完
and qt.ajbh = ay.ajbh
and qt.jczt_dm = zt.jczt_dm
and ay.LRDW_BM = jg.swjg_dm
and ay.nsrsbh = nsr.nsrsbh
union
--当该人是执行人员
select qt.ajbh, qt.lrajbh, nsr.nsrsbh, nsr.nsrmc, jg.swjg_mc, zt.jczt_mc, qt.sfla
from
ctais2wg.t03_qtaj_zxry zxr
,ctais2wg.t03_qtajxx qt
,ctais2wg.t03_ayxsqc ay
,ctais2wg.dm_jczt zt
,ctais2wg.dj_nsrxx nsr
,ctais2wg.dm_swjg jg
where
zxr.zxry_dm = '14401000192' --该人负责执行环节
and zxr.yxbz = 'Y'
and zxr.ajbh = qt.ajbh --该人负责的执行环节中包含该案件的检查环节
and qt.AJZXWBRQ is null --该案件没有执行完毕
and (sysdate - qt.ZGAJWCRQ) > 25 --已经超出原定完成日期特定的天数
and (
qt.CLJDSFSRQ is not null or qt.JCJLFSRQ is not null
) --该案件的执行环节仍然没有做完
and qt.ajbh = ay.ajbh
and qt.jczt_dm = zt.jczt_dm
and ay.LRDW_BM = jg.swjg_dm
and ay.nsrsbh = nsr.nsrsbh

[/code]
<think>我们正在处理用户的问题:比较Oracle数据库在Windows系统上当天与前一天的“数据”或“性能”差异。由于问题中提到了“数据对比”和“性能差异”,我们需要分别考虑这两种情况。 1. 数据对比:通常指数据内容的变化,比如中数据的增删改。我们可以通过比较特定的数据快照(例如,通过导出数据为文本或使用校验和)或者通过查询数据库的变更记录(如果开启了审计或日志)来实现。但更常见的是,用户可能关心某些关键业务的数据变化。 2. 性能差异:指数据库运行性能的变化,比如SQL执行时间、系统资源使用情况(CPU、内存、I/O)等。我们可以通过比较两天的性能指标(如AWR报告、Statspack报告)来获取。 由于用户没有明确指定是数据对比还是性能对比,我们将分别提供两种情况的解决方案。 注意:以下方法假设我们能够连接到前一天的数据库状态(例如,有备份或快照)或者已经收集了前一天的性能数据。如果没有,则只能依赖已有的监控数据。 方案一:数据对比 方法1:使用校验和(CHECKSUM)或HASH比较数据 - 如果不大,可以计算整个的校验和(如使用DBMS_CRYPTO包计算HASH值)来比较。但注意,如果很大,计算整个的HASH可能耗时且不现实。 - 另一种方法是逐行比较,但同样效率低。 方法2:使用数据泵导出并比较 - 分别导出当天和前一天的特定(使用数据泵或expdp),然后使用文件比较工具(如fc)比较导出的文件。但这种方法不适用于大,且需要额外存储空间。 方法3:使用Oracle的闪回查询(Flashback Query)或闪回版本查询(Flashback Version Query) - 前提:必须启用了撤销空间(Undo Tablespace)并且保留时间足够长(至少24小时以上)。 - 通过闪回查询,我们可以查询前一天某个时间点的数据,然后与当前数据比较。例如: SELECT * FROM table_name AS OF TIMESTAMP SYSDATE-1; 然后与当前数据做差集(MINUS)比较。 方法4:使用物化视图日志或CDC(Change Data Capture) - 如果已经配置了物化视图日志或CDC,那么可以获取到变更的数据。 方法5:使用触发器记录变更 - 如果上有触发器记录变更,那么可以查询变更记录。 然而,如果没有预先设置,以上某些方法可能无法使用。因此,我们推荐使用闪回查询(如果可用)或导出比较(小)的方法。 方案二:性能对比 方法1:使用AWR报告(需要Oracle诊断包许可) - Oracle的AWR(Automatic Workload Repository)报告可以生成两个时间段的性能数据快照。我们可以生成当天和前一天的AWR报告,然后比较关键指标(如DB Time, Top SQL等)。 方法2:使用Statspack(免费,但功能不如AWR强大) - 如果没有诊断包许可,可以使用Statspack。同样需要生成两个时间段的报告进行比较。 方法3:使用动态性能视图(V$视图)和DBA_HIST视图(需要AWR许可) - 通过查询DBA_HIST_*视图(如DBA_HIST_SYSSTAT)来获取历史性能数据,然后比较当天和前一天同一时间段的数据。 方法4:使用自定义的性能监控 - 如果用户有自己部署的性能监控(如定期收集V$SESSION, V$SQLSTATS等),则可以直接比较这些数据。 由于用户环境是Windows,上述方法在Windows上同样适用,因为Oracle在Windows和Linux上的管理视图和工具基本相同(除了少数操作系统相关的特性)。 具体操作步骤(以数据对比为例,假设我们要比较EMPLOYEES): 1. 检查是否可以使用闪回查询: - 确认撤销空间的保留时间(UNDO_RETENTION)是否大于24小时。 - 查询在一天前的数据: SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY); 2. 将闪回查询的结果与当前数据比较: -- 查找新增的数据(当前有,前一天没有) SELECT * FROM employees MINUS SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY); -- 查找删除的数据(前一天有,当前没有) SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY) MINUS SELECT * FROM employees; 3. 注意:如果有LOB字段,则不能直接使用MINUS,需要单独处理LOB字段。 具体操作步骤(性能对比): 1. 生成AWR报告: - 登录数据库,执行:@?/rdbms/admin/awrrpt.sql - 选择当天和前一天的快照范围,生成两个报告。 2. 比较AWR报告: - 使用Oracle自带的awrddrpt.sql(AWR差异报告)来生成两个时间段的比较报告。 - 执行:@?/rdbms/admin/awrddrpt.sql 注意:awrddrpt.sql会提示输入两个时间段(每个时间段需要指定开始和结束快照),然后生成一个比较报告。 如果用户没有AWR许可,可以使用Statspack: 1. 安装Statspack:@?/rdbms/admin/spcreate.sql 2. 定期收集快照:exec statspack.snap; 3. 生成报告:@?/rdbms/admin/spreport.sql 4. 同样,需要生成两个报告并手动比较。 由于用户的问题比较宽泛,我们提供了两种方向的解决方案。在实际操作中,用户需要明确是数据对比还是性能对比,以及具体对比哪些数据或性能指标。 最后,考虑到用户可能希望有一个具体的例子,我们以数据对比为例(使用闪回查询)给出一个示例脚本: 示例:比较SCOTT.EMP在当天和前一天的变化 1. 确保能够闪回一天前: SHOW PARAMETER undo_retention; -- 应该大于86400秒(24小时) 2. 如果不够,可以临时修改(但需要重启数据库?不,undo_retention是动态参数,但只能保证在撤销空间足够的情况下才能保留那么久): ALTER SYSTEM SET undo_retention=86400; 3. 创建两个临时(可选): CREATE TABLE emp_today AS SELECT * FROM scott.emp; CREATE TABLE emp_yesterday AS SELECT * FROM scott.emp AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY); 4. 比较差异: -- 新增和修改的数据(注意:修改的数据在MINUS操作中会体现为删除旧行,新增新行) SELECT '新增' AS operation, t.* FROM emp_today t LEFT JOIN emp_yesterday y ON t.empno = y.empno WHERE y.empno IS NULL UNION ALL SELECT '删除' AS operation, y.* FROM emp_yesterday y LEFT JOIN emp_today t ON y.empno = t.empno WHERE t.empno IS NULL UNION ALL SELECT '修改' AS operation, t.* FROM emp_today t JOIN emp_yesterday y ON t.empno = y.empno WHERE t.ename <> y.ename OR t.job <> y.job OR ...; -- 需要比较所有字段,或者使用DBMS_COMPARISON包(但需要额外安装) 5. 或者使用MINUS(但会忽略重复行,且需要所有字段都匹配): -- 注意:MINUS会去重,如果没有主键或唯一键,可能会有问题。 -- 查找新增和修改的行(当前有而昨天没有的) SELECT '新增或修改' AS operation, * FROM emp_today MINUS SELECT '新增或修改' AS operation, * FROM emp_yesterday; -- 查找删除的行(昨天有而当前没有的) SELECT '删除' AS operation, * FROM emp_yesterday MINUS SELECT '删除' AS operation, * FROM emp_today; 但是,这种方法无法区分修改和新增(因为修改的行在MINUS中会同时出现在两个结果集中)。因此,更推荐使用主键进行连接比较。 由于问题复杂性,我们只能提供一般性指导。用户需要根据实际环境调整。 注意:在Windows上,Oracle的命令行工具(如SQL*Plus)的使用与Linux相同。 最后,考虑到用户可能需要自动化比较,可以编写PL/SQL脚本或使用第三方工具。 以上方法仅供参考,具体实施需要根据数据库的配置和许可情况。</think>### Oracle数据库在Windows系统上当日与前一天数据/性能对比方法 #### 一、数据内容对比(级/行级) 1. **闪回查询(需启用撤销空间)** ```sql -- 对比数据差异(示例) SELECT '新增' AS 变更类型, t.* FROM 目标 t WHERE NOT EXISTS ( SELECT 1 FROM 目标 AS OF TIMESTAMP SYSDATE-1 y WHERE t.主键 = y.主键 ) UNION ALL SELECT '删除' AS 变更类型, y.* FROM 目标 AS OF TIMESTAMP SYSDATE-1 y WHERE NOT EXISTS ( SELECT 1 FROM 目标 t WHERE t.主键 = y.主键 ); ``` *适用场景:追踪行级增删,需确保`UNDO_RETENTION`参数覆盖时间范围[^1]。 2. **数据泵导出比对** ```powershell rem 前一天导出 expdp user/password@db TABLES=目标 DUMPFILE=day1.dmp DIRECTORY=DATA_PUMP_DIR rem 当天导出 expdp user/password@db TABLES=目标 DUMPFILE=day2.dmp DIRECTORY=DATA_PUMP_DIR rem 使用fc比较文件 fc /B day1.dmp day2.dmp > diff_report.txt ``` *适用场景:全数据二进制校验,适合小[^1]。 #### 二、性能指标对比 1. **AWR报告对比(需Diagnostics Pack许可)** ```sql -- 生成昨日报告 @?/rdbms/admin/awrrpt.sql -- 选择昨日快照范围 -- 生成今日报告 @?/rdbms/admin/awrrpt.sql -- 选择今日相同时段 -- 生成差异报告 @?/rdbms/admin/awrddrpt.sql ``` *关键对比项:* - `DB Time` 变化率 - Top 5 等待事件 - SQL执行时间TOP10 - 内存/IO利用率 2. **Statspack(免费方案)** ```sql -- 安装Statspack @?/rdbms/admin/spcreate.sql -- 手动创建快照 EXEC statspack.snap; -- 生成报告 @?/rdbms/admin/spreport.sql ``` *对比方式:* 人工比较两个时段的报告文件 #### 三、元数据变更追踪 ```sql -- 检查对象变更 SELECT OBJECT_NAME, OBJECT_TYPE, CREATED, LAST_DDL_TIME FROM USER_OBJECTS WHERE LAST_DDL_TIME > SYSDATE-1; -- 统计信息变化 SELECT TABLE_NAME, LAST_ANALYZED, NUM_ROWS FROM USER_TABLES WHERE LAST_ANALYZED > SYSDATE-1; ``` #### 四、自动化监控建议 1. **创建基准快照** ```sql CREATE TABLE perf_baseline AS SELECT SYSDATE AS snap_time, v.* FROM V$SYSSTAT v; ``` 2. **Windows计划任务配置** - 每日定时执行SQL脚本 - 使用批处理调用SQL*Plus: ```bat sqlplus user/password @C:\scripts\daily_check.sql ``` > **注意**: > - 闪回查询依赖足够的undo空间 > - AWR报告需要Oracle企业版许可 > - 推荐使用`DBMS_COMPARISON`包进行高级数据比对(需Oracle 11g+)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值