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

时间:2018-01-22 10:11:49

标签: oracle duplicates inner-join

我有两张桌子:

表1:

+-----------+-----------+------------------+
| ID        | Value     | other            |
+-----------+-----------+------------------+
| 123456    | 5         | 12               |
| 987654    | 7         | 15               |
| 456789    | 6         | 22               |
+-----------+-----------+------------------+

表2:

+-----------+-----------+------------------+
| ID        | Type      | other            |
+-----------+-----------+------------------+
| 123456    | 00        | 2                |
| 123456    | 01        | 6                |
| 123456    | 02        | 4                |
| 987654    | 00        | 7                |
| 987654    | 01        | 8                |
| 456789    | 00        | 6                |
| 456789    | 01        | 16               |
+-----------+-----------+------------------+

现在我执行内连接:

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

这里是SQLfiddle

结果表:

+-----------+-----------+---------+------------------+
| 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的值,则第一个原因将值加倍或增加三倍。

所需表格

+-----------+-----------+---------+------------------+
| 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的行数并将Value的总和除以该计数来实现类似的输出,但它似乎不起作用并且不是所需的输出。

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

值得一提的是,我正在使用的数据库是ORACLE SQL DB。

3 个答案:

答案 0 :(得分:1)

这个怎么样:

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 Fiddle(谢谢!)设置为MySQL,据我所知,它没有像row_number()这样的分析函数。)

答案 1 :(得分:0)

您可以使用CASE块来显示NULL,其MIN值不等于type

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;

答案 2 :(得分:0)

获得结果的方法。

extends ../layout.pug

block content
    results-view