使用select / join从另一个表中插入唯一的对值

时间:2014-03-16 15:45:33

标签: sql oracle join insert

所以我有一张看起来像这样的表:

[sides]
--------------------
left | right
A    | B
A    | C
A    | D
B    | A
--------------------

请注意,第一行和最后一行是相同的值对。我需要做的是将所有唯一对插入另一个表,在上表执行后看起来像这样:

[pairs]
------------------
val1  |  val2
A     |  B
A     |  C
A     |  D
------------------

到目前为止,我有这段代码:

INSERT INTO pairs (val1, val2)
SELECT DISTINCT s1.left, s1.right
FROM sides s1;

正如你所看到的那样,它只复制了对,但不能解决我的问题。

1 个答案:

答案 0 :(得分:1)

使用least()greatest()

INSERT INTO pairs(val1, val2)
    SELECT DISTINCT least(s1.left, s1.right), greatest(s1.left, s1.right)
    FROM sides s1;

编辑:

以上内容应该有效(您可以单独测试select)。你也可以这样做:

INSERT INTO pairs(val1, val2)
    SELECT s1.left, s1.right
    FROM sides s1
    WHERE s1.left < s1.right
    union all
    SELECT s1.left, s1.right
    FROM sides s1
    WHERE s1.left > s1.right and
          not exists (select 1
                      from sides s2
                      where s1.left = s2.right and s1.right = s2.left
                     );

此版本可以利用sides(left, right)上的索引。