none
如何用C#编程删除SQL Server中多个表中某个字段重复的数据? RRS feed

  • 问题

  • 如何用C#编程删除SQL Server中多个表中某个字段重复的数据?假如有十个表(T1,T2,……,
    T10),每个表都有字段‘书名’和‘作者’及其它,我想把这十个表中书名字段重复的行都删除掉,就保留
    一个就行了,保留哪一个无所谓,假定数据库名是library。是不是要用C#写一个二重循环,哪位大侠能帮我
    写一下?
    另外想问一下,放在同一个library数据库里的各个表结构一定要一样吗?比如都是:第一列书名,第二列作
    者,第三列出版社,必须结构顺序完全相同吗?
    谢谢
    2009年11月6日 3:01

答案

  • 你好!

    1 在 SQL 中使用 union 就可以了

    -- 定义一个表,记录所有不重复的书名和作者
    CREATE TABLE [表]([书名] NVARCHAR(50), [作者] NVARCHAR(50))
    
    INSERT INTO [表]
    SELECT [书名],[作者] FROM [表1] UNION  
    SELECT [书名],[作者] FROM [表2] UNION  
    SELECT [书名],[作者] FROM [表3]
    2 顺序不要求完全一致


    知识改变命运,奋斗成就人生!
    2009年11月6日 3:17
  • 为什么不考虑数据库里面直接操作掉呢?这样也省却了网络之间的传输开销。
    另外,列的顺序没关系的,你只要查询的时候顺序对应就可以了,然后哪些删除哪些保留订好一个规则。
    楼主可以参考下面一个表里面的合并方法:
    http://social.microsoft.com/Forums/zh-CN/sqlserverzhchs/thread/d039ce30-04a9-4e3f-b2dd-314bae0f21ea

    2009年11月6日 3:42
    版主
  • 你好!

    通通上面的代码获取到不重复的书名及作者后,你可以循环这个结果,判断关键字第一次在那个表中出现,在第一次出现的表删除所有和关键字相同的记录,再将关键字信息插入进来(解决同表重复),删除其它表中和关键字相同的记录。

    如果没有什么特殊的要求,建议还是合成一张表好一些。

    知识改变命运,奋斗成就人生!
    2009年11月6日 8:18
  • 你好! 

    我已在另外的一个帖子中回复你您的问题,如果有其它问题,请继续讨论,请不要重复发帖。 

    http://social.microsoft.com/Forums/zh-CN/adonetzhchs/thread/6ada4cef-6707-4fa6-8c98-2756ea434836
    知识改变命运,奋斗成就人生!
    2009年11月7日 5:49
  • declare @book table(bookid int identity(1,1) primary key,bookname nvarchar(50))

    insert @book
    select 'c#'
    union all
    select 'vb'
    union all
    select 'java'
    union all
    select 'c#'
    union all
    select 'vb'
    union all
    select 'vb.net'

    --原来数据
    select * from @book

    delete @book from @book b1 where b1.bookid!=(select top 1 bookid from @book b2 where b1.bookname=b2.bookname)

    --删除后数据
    select * from @book

    2009年11月8日 12:58

全部回复

  • 如何用C#编程删除SQL Server中多个表中某个字段重复的数据?假如有十个表(T1,T2,……,
    T10),每个表都有字段‘书名’和‘作者’及其它,我想把这十个表中书名字段重复的行都删除掉,就保留
    一个就行了,保留哪一个无所谓,假定数据库名是library。是不是要用C#写一个二重循环,哪位大侠能帮我
    写一下?
    另外想问一下,放在同一个library数据库里的各个表结构一定要一样吗?比如都是:第一列书名,第二列作
    者,第三列出版社,必须结构顺序完全相同吗?
    谢谢
    2009年11月6日 2:50
  • 你好!

    1 在 SQL 中使用 union 就可以了

    -- 定义一个表,记录所有不重复的书名和作者
    CREATE TABLE [表]([书名] NVARCHAR(50), [作者] NVARCHAR(50))
    
    INSERT INTO [表]
    SELECT [书名],[作者] FROM [表1] UNION  
    SELECT [书名],[作者] FROM [表2] UNION  
    SELECT [书名],[作者] FROM [表3]
    2 顺序不要求完全一致


    知识改变命运,奋斗成就人生!
    2009年11月6日 3:17
  • 为什么不考虑数据库里面直接操作掉呢?这样也省却了网络之间的传输开销。
    另外,列的顺序没关系的,你只要查询的时候顺序对应就可以了,然后哪些删除哪些保留订好一个规则。
    楼主可以参考下面一个表里面的合并方法:
    http://social.microsoft.com/Forums/zh-CN/sqlserverzhchs/thread/d039ce30-04a9-4e3f-b2dd-314bae0f21ea

    2009年11月6日 3:42
    版主
  • 十分感谢您的回答,但是还有一个问题,就是T1到T10这十个表删除重复后我还要各自处理,比如T1删除与T2至T10重复的行后,我要得到处理后的T1表,同理我要各自得到处理后的T2,……,T10表,用union做并集后所有是个表都合在一块了,我无法分辨出哪个是T1删除重复行剩下的,我对SQL知之甚少,还望各位大牛多多指教
    2009年11月6日 4:37
  • 你好!

    通通上面的代码获取到不重复的书名及作者后,你可以循环这个结果,判断关键字第一次在那个表中出现,在第一次出现的表删除所有和关键字相同的记录,再将关键字信息插入进来(解决同表重复),删除其它表中和关键字相同的记录。

    如果没有什么特殊的要求,建议还是合成一张表好一些。

    知识改变命运,奋斗成就人生!
    2009年11月6日 8:18
  • 如何用C#编程删除SQL Server中多个表中某个字段重复的数据?假如有十个表(T1,T2,……,
    T10),每个表都有字段‘书名’及其它字段,我想把这十个表中书名字段重复的行都删除掉,就保留
    一个就行了,保留哪一个无所谓,假定数据库名是library。并且我想得到每个表删除重复行后的各自的
    数据表,比如T1删除重复行后的剩下T1单独为一个表,同理依次得到删除重复行后的T2至T10,不要将
    T1至T10合并然后删除重复行,那样得不到各自的表,是不是要用C#写一个二重循环,哪位大侠能帮我
    写一下?
    2009年11月7日 0:06
  • 晕,这个是数据当时设计就有问题吧,导致后期出现这样的麻烦。
    不过应该可以解决的,如果你这几张表这几列没有关系。
    2009年11月7日 4:40
  • 你好! 

    我已在另外的一个帖子中回复你您的问题,如果有其它问题,请继续讨论,请不要重复发帖。 

    http://social.microsoft.com/Forums/zh-CN/adonetzhchs/thread/6ada4cef-6707-4fa6-8c98-2756ea434836
    知识改变命运,奋斗成就人生!
    2009年11月7日 5:49
  • declare @book table(bookid int identity(1,1) primary key,bookname nvarchar(50))

    insert @book
    select 'c#'
    union all
    select 'vb'
    union all
    select 'java'
    union all
    select 'c#'
    union all
    select 'vb'
    union all
    select 'vb.net'

    --原来数据
    select * from @book

    delete @book from @book b1 where b1.bookid!=(select top 1 bookid from @book b2 where b1.bookname=b2.bookname)

    --删除后数据
    select * from @book

    2009年11月8日 12:58
  • declare @book table(bookid int identity(1,1) primary key,bookname nvarchar(50))

    insert @book
    select 'c#'
    union all
    select 'vb'
    union all
    select 'java'
    union all
    select 'c#'
    union all
    select 'vb'
    union all
    select 'vb.net'

    --原来数据
    select * from @book

    delete @book from @book b1 where b1.bookid!=(select top 1 bookid from @book b2 where b1.bookname=b2.bookname)

    --删除后数据
    select * from @book

    2009年11月8日 13:27