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的主要内容,如果未能解决你的问题,请参考以下文章