如何选择与同一表中相应行不匹配的行?

时间:2012-02-28 19:28:23

标签: sql oracle select where-clause

我正在试图弄清楚如何解决这个问题。

我有一个包含多列的表格。这些列中有两个:colA和colB。

行中colA和colB中的值将匹配同一个表中的不同行,但这些列中的实际值将不相等。

所以对于任何一行:

Col_A | Col_B
val1.0  | val2.0

会有另一行

Col_A | Col_B
val1.1| val2.1

有一个异常,这个相应的行不存在,我需要选择这一行。

非常感谢任何有关此问题的帮助。

我一直在处理此类型的查询

Select * 
from table1 e 
where (e.Col_A = val1.0 and e.Col_B = val2.0)
and (e.Col_A != val1.1 and e.Col_B ! = val2.1)

这是否接近?在我写这篇文章时,如果一个条款为真,那么另一条也必须是真的。

提前感谢任何帮助或提示。

有关要求澄清的其他信息。

我正在做的是更新表格。该表有一个列,用于捕获和标记上述规则的任何例外情况。

该表有大约12列,其中两列可以有两个可能的值之一。这两列的值类型是varchar2(30)通常,对于具有一组值的任何行,将有另一行具有其他值。一些其他不相关的列可以是相同的但不一定。

我实现的代码与下面的代码类似,基于KAJ的左连接建议。但是,它似乎在直接查询中返回太多行,并且在更新中它实际上更新了每一行。

Update TableA Set Col_Ex = ('Exception')
Where Exists 
(Select ... Example from Kaj s suggestion below);

3 个答案:

答案 0 :(得分:4)

假设如下:
1.值是固定的(即1.0到1.1和2.0到2.1)
2.您要查找的是相应行不存在的原始行 3.原始行和相应行之间的连接位于您未提及的列中(我在下面将其称为键)
......那么类似下面的东西应该有效:

select original.*
from table original
  left outer join table corresponding on corresponding.key = original.key and corresponding.Col_A = 'val1.1' and corresponding.Col_B = 'val2.1'
where original.Col_A = 'val1.0'
  and original.Col_B = 'val2.0'
  and corresponding.key is null

答案 1 :(得分:2)

Select e.*  from table e
where (e.Col_A = val1.0 and e.Col_B = val2.0) 
and NOT EXISTS(SELECT * FROM table e2 
           WHERE e2.Col_A = val1.1 
           and e2.Col_B = val2.1 AND e2.key = e.key) 

答案 2 :(得分:1)

我假设您的值1.0和1.1只是众多的一个例子。否则,将不会有多个记录要查找。你在寻找A2 =(A1 + 0.1)的值吗?如果是这样,你可以使用这样的东西:

select t1.col_a, t1.col_b
from table t1
left join table t2 on 
    (t2.col_a = t1.col_a + 0.1 and t2.col_b = t1.col_b + 0.1)
where
    t2.col_a is null and t2.col_b is null

当没有符合连接条件的记录时,LEFT JOIN将返回空值。