【问题标题】:Delete Rows with Duplicate Column Data in Specific Columns删除特定列中具有重复列数据的行
【发布时间】:2013-01-03 14:12:00
【问题描述】:

我有一个表,我们将其称为 Table1,其中包含一堆垃圾数据,并且没有唯一标识符列。

我想从 Table1 中选择一些列并将数据传输到 Table2。但是,转移后,我需要从 Table2 中删除行,其中 3 列中有重复项。

假设我在 Table2 中有一行 [FirstName][LastName][CompanyName][City][State] 列已转移。我只希望保留具有 [FirstName][LastName][CompanyName] 的唯一组合的行。更令人困惑的是,[LastName] 和/或[CompanyName] 可能包含 NULL 值。我怎么能做到这一点?提前感谢您的帮助。

【问题讨论】:

  • 您使用的是哪个 DBMS?甲骨文? PostgreSQL?
  • SELECT DISTINCT [FirstName],[LastName],['CompanyName'] FROM [Table]你试过这个吗?

标签: sql


【解决方案1】:

可以使用distinct 关键字创建唯一条目。

select distinct 
       FirstName, 
       LastName, 
       CompanyName 
  from MyTable

因此,如果您发出以下命令,您只会将不同的值添加到新表中

insert into newTable
(
       FirstName, 
       LastName, 
       CompanyName 
)
select distinct 
       FirstName, 
       LastName, 
       CompanyName 
  from MyTable
 where not exists (
   select 1 from newTable 
    where newTable.FirstName   = MyTable.FirstName
      and newTable.LastName    = MyTable.LastName
      and newTable.CompanyName = MyTable.CompanyName
  ) 

另一种向表中添加不同的新值的好方法是使用“MERGE”命令。

merge newtable as target
using (select distinct 
              FirstName, 
              LastName, 
              CompanyName 
         from MyTable
       ) as source
   on target.FirstName   = target.FirstName
  and target.LastName    = target.LastName
  and target.CompanyName = target.CompanyName

when not matched by target then
  insert (FirstName, 
          LastName, 
          CompanyName)
  values (target.FirstName, 
          target.LastName, 
          target.CompanyName);

MERGE 命令让您可以选择控制何时同步表。

【讨论】:

    【解决方案2】:

    看这里的例子,可能这就是你想要的..link

    insert into Table2(`firstname` , `lastname` , `companyname`)
    select a.firstname,a.lastname,a.companyname 
    from 
    (select distinct(concat(firstname,',',lastname,',',companyname))
    ,firstname,lastname,companyname from Table1) a;
    

    【讨论】:

      【解决方案3】:
      create table t2
      as
      select distinct FirstName,LastName,CompanyName,City,State from t1;
      
      with the below query u 'll get to know we have duplicate entries or not.
      select FirstName,LastName,CompanyName,count(*) from t2
      group by FirstName,LastName,CompanyName
      having Count(*) >1;
      
      delete from t2 a where rowid not in (select min(rowid) from t2 b where a.column1=b.column1 
      and .....);
      

      【讨论】:

        猜你喜欢
        • 2020-07-08
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-15
        相关资源
        最近更新 更多