使用 DISTINCT 消除重复项
DISTINCT 关键字可从 SELECT 语句的结果中除去重复的行。如果没有指定 DISTINCT,那么将返回所有行,包括重复的行。例如,如果在 titleauthor 中选择所有作者 ID 时未使用 DISTINCT,那么将会返回下列行(其中包括一些重复的行):USE pubs
SELECT au_id
FROM titleauthor下面是结果集:au_id       
----------- 
172-32-1176 
213-46-8915 
213-46-8915 
238-95-7766 
267-41-2394 
267-41-2394 
274-80-9391 
409-56-7008 
427-17-2319 
472-27-2349 
486-29-1786 
486-29-1786 
648-92-1872 
672-71-3249 
712-45-1867 
722-51-5454 
724-80-9391 
724-80-9391 
756-30-7391 
807-91-6654 
846-92-7186 
899-46-2035 
899-46-2035 
998-72-3567 
998-72-3567 (25 row(s) affected)而使用了 DISTINCT 后,就能够除去重复项,而只查看唯一的作者 ID:USE pubs
SELECT DISTINCT au_id
FROM titleauthor下面是结果集:au_id       
----------- 
172-32-1176 
213-46-8915 
238-95-7766 
267-41-2394 
274-80-9391 
409-56-7008 
427-17-2319 
472-27-2349 
486-29-1786 
648-92-1872 
672-71-3249 
712-45-1867 
722-51-5454 
724-80-9391 
756-30-7391 
807-91-6654 
846-92-7186 
899-46-2035 
998-72-3567 (19 row(s) affected)这是SQL的说明,但是只要表中如果存在Text、ntext、image类型字段时,需要进行查询时,就会出现“不能以DISTINCT方式选择Text、ntext、image数据类型”
不知道怎么去解决这个问题?

解决方案 »

  1.   

    这个问题记得很久前有人问题过
    DISTINCT 是对一条记录来判的
    SELECT DISTINCT au_id
    FROM titleauthor
    肯定是没问题的,对可变字段,如Text、ntext、image,是不可判的(SQL要考虑效率),那你可以在查询中不用这些字段名.
    如一个表为:
      id integer,au_id varchar(10),pic image
    你可用SELECT DISTINCT au_id FROM titleauthor来得到不重复的au_id 
    要得到你重复的pic一般是没实际意义的,如果真的需要,你可加一字段,pic_id(用integer或varchar类型,为pic的一个标识符),来与image一一对应.这样可以用
    SELECT DISTINCT pic_id FROM titleauthor
    来判pic字段是否唯一,你也可用
    SELECT DISTINCT au_id,pic_id FROM titleauthor来得到两者都不重复的记录
      

  2.   

    如果你的表结构已经固定,且表中有主键的话,可考虑新建一个表(如titleauthor_add),在新表中用老表的主键与老表一一对应(如id),并新建pic_id与老表的pic一一对应,并在老表上用触发器对新表进行增/删/改(在程序中同时对二表操作也是可行的),
    SQL可以这样写:
    SELECT DISTINCT a.au_id,b.pic_id FROM titleauthor a,titleauthor_add b where a.id=b.id
    在不修改表结构的情况下,要对表新增字段,我一般都用此方法(只是效率低了些)
      

  3.   

    谢谢了,这些方案我都想过了,我只是在想,DISTINCT 又不使用在不能使用的字段,只是使用在一般类型的字段,为什么这样不行,SQL语言应该可以支持,唉,只是SQLSERVER功能上不满足吧.
      

  4.   

    --建立测试环境
    Create table TEST (ID Int ,Name Varchar(10),Re Text)
    GO
    --插入数据
    Insert TEST Values(1,'AA','asadsad')
    Insert TEST Values(1,'AA','asadsad')
    Insert TEST Values(1,'BB','DSDSS')
    Insert TEST Values(1,'CC','SFF')
    GO
    --测试
    Select * from TEST
    Select Distinct ID,Name,Convert(Varchar(8000),Re) As Re Into #T from TEST
    Delete from TEST
    Insert TEST Select * from #T
    Select * from TEST
    --删除测试环境
    Drop table TEST,#T
    GO
    --结果
    /*
    --删除前
    IDNameRe
    1AAasadsad
    1AAasadsad
    1BBDSDSS
    1CCSFF--删除后
    IDNameRe
    1AAasadsad
    1BBDSDSS
    1CCSFF
    */
      

  5.   

    Select Distinct ID,Name,Convert(Varchar(8000),Re) As Re Into #T from TEST
    执行倒是可以,但是如果ID有N条记录时,查询应该只有一条吧,我在SQL查询器上,进行试验,加不加关键字Distinct 是一样的,不问ID是不是重复,我可以肯定地告诉你这样低级的错误我是不会犯的
      

  6.   

    你看看上边对Text字段是怎么处理的,看看有没有对于你的问题有帮助的,没有帮助你可以认为是垃圾代码。
    好心帮助你,做人都不会