【问题标题】:Insert unique pair values from another table with select/join使用 select/join 从另一个表中插入唯一的对值
【发布时间】:2014-03-16 15:45:32
【问题描述】:

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

[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;

如您所见,它只是复制对,而不是解决我的问题。

【问题讨论】:

    标签: sql oracle join insert


    【解决方案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) 上的索引。

    【讨论】:

    • 我不知道为什么,但它只是冻结并等待执行,但看起来没有任何事情发生。
    • UPDATE:尝试了编辑的代码,现在它说“违反了唯一约束。UPDATE 或 INSERT 语句试图插入重复的键。”。我在对表中的键是 val1 和 val2。
    • @CompanyCodeMonkey 。 . .糟糕,我遗漏了最重要的条件之一。
    • 现在它与编辑后的代码完美配合,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 2015-05-28
    • 2021-10-19
    相关资源
    最近更新 更多