Oracle 如何从SQL内部联接表中删除重复值?

Oracle 如何从SQL内部联接表中删除重复值?,oracle,duplicates,inner-join,Oracle,Duplicates,Inner Join,我有两张桌子: 表1: +-----------+-----------+------------------+ | ID | Value | other | +-----------+-----------+------------------+ | 123456 | 5 | 12 | | 987654 | 7 | 15 | | 456789 |

我有两张桌子:

表1:

+-----------+-----------+------------------+
| ID        | Value     | other            |
+-----------+-----------+------------------+
| 123456    | 5         | 12               |
| 987654    | 7         | 15               |
| 456789    | 6         | 22               |
+-----------+-----------+------------------+
+-----------+-----------+------------------+
| ID        | Type      | other            |
+-----------+-----------+------------------+
| 123456    | 00        | 2                |
| 123456    | 01        | 6                |
| 123456    | 02        | 4                |
| 987654    | 00        | 7                |
| 987654    | 01        | 8                |
| 456789    | 00        | 6                |
| 456789    | 01        | 16               |
+-----------+-----------+------------------+
+-----------+-----------+---------+------------------+
| ID        | Type      | Value   | other            |
+-----------+-----------+---------+------------------+
| 123456    | 00        | 5       | 2                |
| 123456    | 01        | 5       | 6                |
| 123456    | 02        | 5       | 4                |
| 987654    | 00        | 7       | 7                |
| 987654    | 01        | 7       | 8                |
| 456789    | 00        | 6       | 6                |
| 456789    | 01        | 6       | 16               |
+-----------+-----------+---------+------------------+
+-----------+-----------+---------+------------------+
| ID        | Type      | Value   | other            |
+-----------+-----------+---------+------------------+
| 123456    | 00        | 5       | 2                |
| 123456    | 01        | -       | 6                |
| 123456    | 02        | -       | 4                |
| 987654    | 00        | 7       | 7                |
| 987654    | 01        | -       | 8                |
| 456789    | 00        | 6       | 6                |
| 456789    | 01        | -       | 16               |
+-----------+-----------+---------+------------------+
表2:

+-----------+-----------+------------------+
| ID        | Value     | other            |
+-----------+-----------+------------------+
| 123456    | 5         | 12               |
| 987654    | 7         | 15               |
| 456789    | 6         | 22               |
+-----------+-----------+------------------+
+-----------+-----------+------------------+
| ID        | Type      | other            |
+-----------+-----------+------------------+
| 123456    | 00        | 2                |
| 123456    | 01        | 6                |
| 123456    | 02        | 4                |
| 987654    | 00        | 7                |
| 987654    | 01        | 8                |
| 456789    | 00        | 6                |
| 456789    | 01        | 16               |
+-----------+-----------+------------------+
+-----------+-----------+---------+------------------+
| ID        | Type      | Value   | other            |
+-----------+-----------+---------+------------------+
| 123456    | 00        | 5       | 2                |
| 123456    | 01        | 5       | 6                |
| 123456    | 02        | 5       | 4                |
| 987654    | 00        | 7       | 7                |
| 987654    | 01        | 7       | 8                |
| 456789    | 00        | 6       | 6                |
| 456789    | 01        | 6       | 16               |
+-----------+-----------+---------+------------------+
+-----------+-----------+---------+------------------+
| ID        | Type      | Value   | other            |
+-----------+-----------+---------+------------------+
| 123456    | 00        | 5       | 2                |
| 123456    | 01        | -       | 6                |
| 123456    | 02        | -       | 4                |
| 987654    | 00        | 7       | 7                |
| 987654    | 01        | -       | 8                |
| 456789    | 00        | 6       | 6                |
| 456789    | 01        | -       | 16               |
+-----------+-----------+---------+------------------+
现在我执行内部联接:

SELECT
  table1.ID, table2.TYPE, table1.value, table2.other 
FROM
  table1 INNER JOIN table2 ON table1.ID = table2.ID
这是

结果表:

+-----------+-----------+------------------+
| ID        | Value     | other            |
+-----------+-----------+------------------+
| 123456    | 5         | 12               |
| 987654    | 7         | 15               |
| 456789    | 6         | 22               |
+-----------+-----------+------------------+
+-----------+-----------+------------------+
| ID        | Type      | other            |
+-----------+-----------+------------------+
| 123456    | 00        | 2                |
| 123456    | 01        | 6                |
| 123456    | 02        | 4                |
| 987654    | 00        | 7                |
| 987654    | 01        | 8                |
| 456789    | 00        | 6                |
| 456789    | 01        | 16               |
+-----------+-----------+------------------+
+-----------+-----------+---------+------------------+
| ID        | Type      | Value   | other            |
+-----------+-----------+---------+------------------+
| 123456    | 00        | 5       | 2                |
| 123456    | 01        | 5       | 6                |
| 123456    | 02        | 5       | 4                |
| 987654    | 00        | 7       | 7                |
| 987654    | 01        | 7       | 8                |
| 456789    | 00        | 6       | 6                |
| 456789    | 01        | 6       | 16               |
+-----------+-----------+---------+------------------+
+-----------+-----------+---------+------------------+
| ID        | Type      | Value   | other            |
+-----------+-----------+---------+------------------+
| 123456    | 00        | 5       | 2                |
| 123456    | 01        | -       | 6                |
| 123456    | 02        | -       | 4                |
| 987654    | 00        | 7       | 7                |
| 987654    | 01        | -       | 8                |
| 456789    | 00        | 6       | 6                |
| 456789    | 01        | -       | 16               |
+-----------+-----------+---------+------------------+
这完全是我所期望的,但不是我所需要的。 因为如果我现在想要得到每个ID的值,那么第一个原因的值会加倍或三倍

所需表格:

+-----------+-----------+------------------+
| ID        | Value     | other            |
+-----------+-----------+------------------+
| 123456    | 5         | 12               |
| 987654    | 7         | 15               |
| 456789    | 6         | 22               |
+-----------+-----------+------------------+
+-----------+-----------+------------------+
| ID        | Type      | other            |
+-----------+-----------+------------------+
| 123456    | 00        | 2                |
| 123456    | 01        | 6                |
| 123456    | 02        | 4                |
| 987654    | 00        | 7                |
| 987654    | 01        | 8                |
| 456789    | 00        | 6                |
| 456789    | 01        | 16               |
+-----------+-----------+------------------+
+-----------+-----------+---------+------------------+
| ID        | Type      | Value   | other            |
+-----------+-----------+---------+------------------+
| 123456    | 00        | 5       | 2                |
| 123456    | 01        | 5       | 6                |
| 123456    | 02        | 5       | 4                |
| 987654    | 00        | 7       | 7                |
| 987654    | 01        | 7       | 8                |
| 456789    | 00        | 6       | 6                |
| 456789    | 01        | 6       | 16               |
+-----------+-----------+---------+------------------+
+-----------+-----------+---------+------------------+
| ID        | Type      | Value   | other            |
+-----------+-----------+---------+------------------+
| 123456    | 00        | 5       | 2                |
| 123456    | 01        | -       | 6                |
| 123456    | 02        | -       | 4                |
| 987654    | 00        | 7       | 7                |
| 987654    | 01        | -       | 8                |
| 456789    | 00        | 6       | 6                |
| 456789    | 01        | -       | 16               |
+-----------+-----------+---------+------------------+
我试图通过计算每个id的行数并将值之和除以该计数来实现类似的输出,但它似乎不起作用,也不是期望的输出

此外,我尝试分组,但这似乎没有达到预期的输出


需要提及的一点是,我正在使用的数据库是ORACLE SQL数据库。

您可以使用
大小写
块来显示
NULL
,它不等于
类型
MIN

SELECT table1.ID,
       table2.TYPE,
       CASE
          WHEN table2.TYPE =
                  MIN (table2.TYPE)
                     OVER (PARTITION BY table1.id ORDER BY table2.TYPE)
          THEN
             Table1.VALUE
       END
          VALUE,
       table2.other
  FROM table1 INNER JOIN table2 ON table1.ID = table2.ID;

一种获得结果的方法

  select   t1.ID,
           t2.type, 
           t1.value,
           t2.other
    from table1 t1 inner join table2 t2
    ON t1.ID = t2.ID
    inner join (select ID, min(type) mv
    from table2
    group by id) m
    on t2.id = m.id
    and t2.type = m.mv
    union all
    select t1.ID,
           t2type, 
           null,
           t2.other
    from table1 t1 inner join table2 t2
    ON t1.ID = t2.ID
    and not exists (
    select 1 from (
    select ID, min(type) mv
    from table2
    group by id) m
    where t2.id = m.id
    and t2.type = m.mv
    )

    order by id,type
这个怎么样:

select table1.id
     , table2.type
     , case
           when row_number() over (partition by table1.id order by table2.type) = 1
           then table1.value
       end as "VALUE"
     , table2.other
from   table1
       join table2 on table1.id = table2.id
order by 1, 2;

(这是Oracle SQL语法。您的SQL FIDLE(谢谢!)被设置为MySQL,据我所知,MySQL没有类似于
row_number()
)的分析函数。

如果类型“00”包含一个值,那么类型01和类型02的每个id都会有相同的值吗?@KaushikNayak Yes,看到我放在那里的SQLfiddle链接,其他类型的值也会被复制…这就是我的问题变得不准确的地方,对此我很抱歉。如果类型不总是'00',但有时最低的是'123'@M.Wagner:Modified now,您知道选项吗。请检查。工作完美,我会注意到我在小提琴下一次使用正确的设置。