用于排除值的SQL select查询

时间:2017-06-02 12:34:02

标签: sql oracle where clause

输入查询:

SELECT a.ml_STi_File_id as File_ID, a.ML_STI_SRC_SYS_CD as Src_CD, concat(a.EVENT_CD,a.BUS_AREA_CD) as BE
FROM FFI_ERR_RLT_TRN a, summary_tbl b 
WHERE  a.ml_sti_src_sys_cd = b.ml_sti_src_sys_cd 
AND a.ml_sti_load_dttm = b.ml_sti_load_dttm
AND a.ml_sti_cycle_cd = b.ml_sti_cycle_cd 
AND a.ml_sti_file_id = b.ml_sti_file_id 
AND a.ml_sti_srcsys_dttm = b.ml_sti_srcsys_dttm 
AND a.ML_STI_CYCLE_CD = '0519201701'
group  BY   a.ML_STI_SRC_SYS_CD, a.ml_STi_File_id, a.BUS_AREA_CD,a.EVENT_CD, a.ml_sti_cycle_cd
order by a.ml_sti_src_sys_cd desc;  

输入:

FILE_ID  SRC BE
-------- --- ------------------------
00428589 631
00428581 623 FTE
00428581 623 FTI
00428581 623 PRP
00428581 623 SPA
00428568 029

所需的输出:

FILE_ID  SRC BE
-------- --- ------------------------
00428589 631
00428581 623 PRP
00428581 623 SPA
00428568 029

有人可以帮我这个吗?

提前致谢。

我正在使用oracle SQL。

使用上述查询获取输入数据。从输入数据我必须过滤掉输出如上所示

1 个答案:

答案 0 :(得分:0)

如果您显示为"输入"是现有查询的结果,您可以通过向现有WHERE子句添加条件来过滤掉不需要的行。像

这样的东西
... [top part of your query here] ...
WHERE
...
AND (    concat(a.EVENT_CD,a.BUS_AREA_CD) is null
      or (a.ML_STI_SRC_SYS_CD, concat(a.EVENT_CD,a.BUS_AREA_CD))
         not in
         ( (623, 'FTE'), (623, 'FTI'), (623, 'PYT'),
           (625, 'FTE'), (625, 'FTI'),
           (626, 'FTE'), (626, 'FTI'),
           (628, 'FTE'), (628, 'FTI')
         )
    )
.......

请注意,我特意处理了BE为空时的情况(根据您所描述的内容,不应排除这些行)。我没有处理SRC_CD为空,但如果它在数据中可以为null,则还需要处理它。另请注意,SELECT子句中给出的别名不能在WHERE子句中使用,您需要使用我所显示的完整定义(或者您可以使用子查询 - 外部查询结构,效率较低)。

如果将所有异常(NOT IN条件中的内容)存储在表中会更好;然后NOT IN条件会更简单,引用该表而不是硬编码异常。