Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何选择与同一表中相应行不匹配的行?_Sql_Oracle_Select_Where Clause - Fatal编程技术网

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

Sql 如何选择与同一表中相应行不匹配的行?,sql,oracle,select,where-clause,Sql,Oracle,Select,Where Clause,我正在想办法解决这个问题 我有一个多栏的表格。这些栏目有两种:可乐和可乐 行中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_

我正在想办法解决这个问题

我有一个多栏的表格。这些栏目有两种:可乐和可乐

行中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);

我假设你的值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

当没有符合联接条件的记录时,左联接将返回空值。

假设如下:
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

你想要谓词,或者更准确地说,它的倒装形式,
不存在
。鉴于你已经得到了3个非常不同的答案,你能澄清行是如何链接的(是A列和B列还是其他列)谢谢你的快速回答,希望我能澄清一些问题。桌子上一排有可乐和可乐。在一行中,如果ColA的值为1.0,则ColB的值为2.0;现在,理想情况下,该行将有一个值分别为1.1和2.1的对应行。这些是唯一可以存在的价值观。我正在寻找那些不存在相应行的偶尔时间。我已经开始尝试答案了。再次感谢。感谢您的回复。我正在测试这一行,但到目前为止,我没有收到任何行,我一直在测试,我知道有三行应该返回。我仍然认为这看起来像我需要的,我认为“不存在”应该是值等于val1.1和val2.1的地方,因为你已经得到了否定。然后您还需要将其链接回主行-列A和列B不是连接列(请参见dee对我的假设列表的回复)@KAJ谢谢您捕捉到这一点,我的复制粘贴失败。应该是固定的。还将附上关键比较。您的假设都是正确的。我现在正在尝试实现它,我有一个语法错误,但这可能是我这边的问题。谢谢您的回答,我以后一定会更新。如果您遇到问题,请提供更多有关您正在使用的表以及您遇到的错误的信息,然后也许我/我们可以进一步帮助您。我将此设置为我的答案。我还没有能够实施它。(我弄坏了脚趾,所以我在测试中被耽搁了)我很确定这是这个想法的一些变化。只是最后一次更新,我在更新中使用了not exists,并排除了join子句,因为我已经在更新中添加了它,类似于:更新原始a SET Colz='exception',WHERE not exists(从对应的B中选择*,其中A.Key=B.Key和A.ColA类似于B.ColA)结果表明ColB是一种误导,对查询来说并不重要。我认为这意味着我应该将Sam的标记为正确,尽管我认为两者都可以。哦,谢谢大家。
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