如何从下面过滤特定记录?

How to filter specific records from the below?

我有一个 table (Mytable),其值如下;

CustNo Audit   History   Inputter Authoriser

 1     CHANGE  CURRENT    XYZ      XYZ
 2     CHANGE  BEFORE     XYZ      XYZ
 2     CHANGE  CURRENT    TOM      TOM
 3     ADD     NEW        TOM      TOM

如果 Inputter 和 Authoriser 的值是 'XYZ' 且 Audit = 'CHANGE' 和 History = 'CURRENT',我只需要过滤掉记录,但它可以将 Audit 和 history 作为Inputter 和 Authoriser 的 CHANGE 和 BEFORE 分别具有值 'XYZ' 和其他记录

我的预期输出如下:

CustNo Audit   History   Inputter Authoriser

 2     CHANGE  BEFORE     XYZ      XYZ
 2     CHANGE  CURRENT    TOM      TOM
 3     ADD     NEW        TOM      TOM

我使用了下面的但我没有得到我例外的东西;

select * from Mytable
where  (Inputter != 'XYZ' and Authoriser != 'XYZ' and Audit != 'CHANGE' and History != 'CURRENT' )

谁能指正一下,如何达到我的预期输出。提前致谢。

**请编辑我的要求,以下是新的例外情况; **

现在我的现有需求中需要添加另一个场景, 下面是 table 条记录;

CustNo Audit   History   Inputter Authoriser

 1     ADD     NEW        Sasha    Sasha      
 1     CHANGE  BEOFRE     MAX      MAX
 1     CHANGE  CURRENT    XYZ      XYZ
 2     CHANGE  BEFORE     XYZ      XYZ
 2     CHANGE  CURRENT    TOM      TOM
 3     ADD     NEW        TOM      TOM
 3     CHANGE  CURRENT    MAX      MAX

如果任何输入者和授权者有 'XYZ' 审计和历史记录有 'CHANGE''CURRENT' 那么该记录应该与任何事件一起删除(这是现有的工作) table.

中的相同custNo

例如,这里 custNo = 1'XYZ''CHANGE' & 'CURRENT', 所以这应该连同删除;

custNo = 1'CHANGE' & 'BEOFRE' 对于 'MAX'
custNo = 1'ADD' & 'NEW' 对于 'Sasha'

换句话说 - 删除任何出现的相同 CustNo (在 Inputter 和 Authoriser 字段中都有 'XYZ',在 'CHANGE''CURRENT' 中审计和历史字段),不管任何审计和历史,即使该客户在输入者和授权人字段中没有 'XYZ'

新的预期输出:

CustNo Audit   History   Inputter Authoriser

 2     CHANGE  BEFORE     XYZ      XYZ
 2     CHANGE  CURRENT    TOM      TOM
 3     ADD     NEW        TOM      TOM
 3     CHANGE  CURRENT    MAX      MAX

而不是 AND 在条件

中使用 OR

DEMO

select * from Mytable
where  (Inputter != 'XYZ' or Authoriser != 'XYZ' or Audit != 'CHANGE' or History != 'CURRENT' )

输出:

Audit   History  Inputter   Authoriser
Change  before   xyz          xyz
Change  CURRENT  TOM          TOM
ADD       NEW    TOM          TOM

您有一个选择是执行以下操作。使用 CASE 语句过滤出 xyz 匹配特定条件的记录

select * 
  from Mytable a
 where  CASE WHEN a.Inputter=a.Authoriser AND a.Inputter='XYZ' AND a.Audit='CHANGE' AND a.History ='CURRENT'THEN
                  NULL
             ELSE a.History
         END = a.History

您可以使用 minus 设置运算符:

with t( CustNo, Audit, History, Inputter, Authoriser ) as
(
 select 1,'CHANGE','CURRENT','XYZ','XYZ'  union all
 select 2,'CHANGE','BEFORE','XYZ','XYZ'  union all
 select 2,'CHANGE','CURRENT','TOM','TOM'  union all
 select 3,'ADD','NEW','TOM','TOM' 
)
select * from t
minus
select *
  from t
 where Audit = 'CHANGE'
   and History = 'CURRENT'
   and Authoriser = 'XYZ';

CustNo  Audit   History   Inputter  Authoriser
------- ------  --------  --------  ----------
  2     CHANGE  BEFORE     XYZ      XYZ
  2     CHANGE  CURRENT    TOM      TOM
  3     ADD     NEW        TOM      TOM

或者可以使用 not in :

select * 
  from t
where ( Audit, History, Authoriser ) not in 
      (
        select Audit, History, Authoriser
          from t
         where Audit = 'CHANGE'
           and History = 'CURRENT'
           and Authoriser = 'XYZ' );

最简单的做法是使用 not:

SELECT CustNo, Audit, History, Inputter, Authoriser
FROM MyTable
WHERE NOT (
    Inputter = 'XYZ' 
    AND Authoriser = 'XYZ' 
    AND Audit = 'CHANGE' 
    AND History = 'CURRENT'
)

update:至于新需求,用not exists很容易搞定:

SELECT CustNo, Audit, History, Inputter, Authoriser
FROM MyTable t0
WHERE NOT EXISTS
(
    SELECT 1
    FROM MyTable t1
    WHERE t1.CustNo = t0.CustNo
    AND Inputter = 'XYZ' 
    AND Authoriser = 'XYZ' 
    AND Audit = 'CHANGE' 
    AND History = 'CURRENT'
)