Oracle 查询 where field1=field2 and field2=field1

Posted

技术标签:

【中文标题】Oracle 查询 where field1=field2 and field2=field1【英文标题】:Oracle query where field1=field2 and field2=field1 【发布时间】:2019-03-19 01:21:21 【问题描述】:

所以我有一个包含链接关系的表。 Field1 是 ID,Filed2 是 ID。到目前为止,我已经消除了重复的 Field1\Field2 组合。但是,我仍然有相反的情况发生。含义 Field1 出现在 Field2 中,Field2 出现在 Field1 中,用于同一条记录。我在内部连接中尝试了一个子查询,但它返回到许多行。提前致谢!

select a.field1, a.field2 from linktable
inner join (select field1, field2 from linktable) b on a.field1=b.field2 and a.field2=b.field1;

样本数据:

insert into linktable(field1, field2) values ('ABC', '123');
insert into linktable(field1, field2) values ('123', 'ABC');

我想识别并删除出现上述示例数据的情况。

【问题讨论】:

样本数据和期望的结果会有所帮助。 【参考方案1】:

这样的事情应该会让你得到配对:

SELECT a.field1, a.field2
  FROM linktable a
  JOIN linktable b ON (b.field1 = a.field2 AND b.field2 = a.field1)

编辑:查找其中一对的示例:

create table linktable(id number, field1 varchar2(32), field2 varchar2(32));
insert into linktable(id, field1, field2) values (1, 'ABC', '123');
insert into linktable(id, field1, field2) values (2, '123', 'ABC');

SELECT a.field1, a.field2, LEAST(a.id, b.id) AS id_to_delete
  FROM linktable a
  JOIN linktable b ON (b.field1 = a.field2 AND b.field2 = a.field1);

结果:

FIELD1  FIELD2  ID_TO_DELETE
123     ABC     1
ABC     123     1

【讨论】:

我想就是这样。它实际上返回与我的查询相同的结果 # 我简直不敢相信它可能是正确的。现在的诀窍是,如何删除一个并保留另一个。 您是否可以制定规则来决定您更喜欢哪一对?类似于“具有最大 id 的那个”?因为那时您可以在查询中添加类似LEAST(a.id, b.id) 的内容,并将其用作要删除的标识符。【参考方案2】:

您应该发布示例数据和预期结果。

我认为这个查询可能对你有用,这可以防止逆发生为 field1, field2 = (x, y)(y, x)

SELECT field1, field2 
FROM linktable
WHERE field1 >= field2;

【讨论】:

【参考方案3】:

这是你想要的吗?

select field1, field2
from (select field1, field2, 
             row_number() over (partition by least(field1, field2), greatest(field1, field2) order by field1) as seqnum
      from t
     ) t
where seqnum = 1;

无论排序如何,这都会返回一个field1/field2 实例。

【讨论】:

我想多尝试一下,但它说我缺少一个 ORDER BY。

以上是关于Oracle 查询 where field1=field2 and field2=field1的主要内容,如果未能解决你的问题,请参考以下文章

使用 UNION 更新查询

如何在 pynamodb ORM 中使用多个 where 条件

mssql 的 存储过程 变量赋值问题

Oracle 赋值数据至表

sp_execute 选择不同的查询计划

Oracle条件查询语句-where