【问题标题】:Oracle query where field1=field2 and field2=field1Oracle 查询 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');

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

【问题讨论】:

  • 样本数据和期望的结果会有所帮助。

标签: sql oracle


【解决方案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。
    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多