SQL Oracle-根据数据匹配规则进行查询以返回行

时间:2018-08-15 09:30:19

标签: sql oracle

我有以下数据

NUMBER      SEQUENCE_NUMBER
CA00000045  AAD508
CA00000045  AAD508
CA00000046  AAD509
CA00000047  AAD510
CA00000047  AAD510
CA00000047  AAD511
CA00000048  AAD511

,我想找出哪些行不符合以下规则:

  当SEQUENCE_NUMBER相同时,

NUMBER将始终相同。

因此,在上述数据中,“ AAD508”将表示SEQUENCE_NUMBER中出现相同值的每一行上的NUMBER值都是相同的。

我想纠正一个查询,该查询将使我返回此规则所在的行 破碎。例如:

CA00000047  AAD511
CA00000048  AAD511

我不知道从哪里开始,所以恐怕没有初始SQL。

谢谢

2 个答案:

答案 0 :(得分:1)

您想对数据进行自我连接,以将每一行与共享同一序列号的所有其他行进行比较,然后使用with语句进行过滤,以仅获取具有不匹配数字的行。您没有为表格指定名称,因此我在下面将其添加为“ table_name”

SELECT 
  a.NUMBER,
  a.SEQUENCE_NUMBER
FROM table_name a
INNER JOIN table_name b
ON a.SEQUENCE_NUMBER = b.SEQUENCE_NUMBER
WHERE a.NUMBER <> b.NUMBER
GROUP BY 1,2 

加入分组以扮演不同的角色

答案 1 :(得分:0)

我只会使用exists

select t.*
from t
where exists (select 1
              from t t2
              where t2.sequence_number = t.sequence_number and
                    t2.number <> t.number
             );

如果sequence_numbers()最多只有两行,则可以将每个违反规则的人放在一行:

select sequence_number, min(number), max(number)
from t
group by sequence_number
having min(number) <> max(number);

或者,您可以将其概括为单个行上的数字列表:

select sequence_number, listagg(number, ',') within group (order by number) as numbers
from t
group by sequence_number
having min(number) <> max(number);