【问题标题】:How to remove duplicate values from SQL inner join tables?如何从 SQL 内连接表中删除重复值?
【发布时间】:2018-01-22 10:11:49
【问题描述】:

我有两张桌子:

表 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 数据库。

【问题讨论】:

  • 如果类型 '00' 包含一个值,那么对于每个 id 的类型 01 和类型 02 以此类推,是否总是如此?
  • @KaushikNayak 是的,请参阅我放在那里的 SQLfiddle 链接,该值也被复制到其他类型...

标签: oracle duplicates inner-join


【解决方案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() 这样的分析函数。)

【讨论】:

  • 完美运行,我要注意下次我在 Fiddle 中使用了正确的设置。
【解决方案2】:

一种获得结果的方法。

  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

【讨论】:

    【解决方案3】:

    您可以使用CASE 块来显示不等于MINtypeNULL

    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;
    

    【讨论】:

    • 这是我的问题变得不准确的地方,我很抱歉。你知道一个选项,如果 TYPE 并不总是'00',但有时最低的是'123'
    • @M.Wagner :现在修改。请检查。
    猜你喜欢
    • 2013-01-14
    • 2012-07-05
    • 2020-06-20
    • 1970-01-01
    • 2017-07-02
    • 2017-06-15
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多