当前位置: 代码迷 >> Sql Server >> 关于distinct用法的几个疑点
  详细解决方案

关于distinct用法的几个疑点

热度:56   发布时间:2016-04-24 09:36:26.0
关于distinct用法的几个疑问
1、distinct必须放在所有字段开头吗
2、distinct的限定范围,是紧随其后的那个字段,还是其后所有字段。

有没有详解讲解SQL语法及使用的详细注意事项的书或资料,

谢谢大家。
------解决思路----------------------
1、如果没有子查询的语句,是的
2、面向行级的不重复。
------解决思路----------------------
1、用于去重时,必须放在所有字段前面;聚合统计时,是放聚合函数内统计字段前面,如 select count(DISTINCT ID) FROM TB
2、是其后所有字段。

我是杂学杂看来的,期待楼下补充详细材料
------解决思路----------------------
1、distinct必须放在所有字段开头吗

是,必须这样做

2、distinct的限定范围,是紧随其后的那个字段,还是其后所有字段。

其后所有的字段,和 group by 的那种效果一样。只是处理方式不一样,group by 还能做其他的事。
------解决思路----------------------
楼上的解释不错
------解决思路----------------------
引用:
Quote: 引用:

1、用于去重时,必须放在所有字段前面;聚合统计时,是放聚合函数内统计字段前面,如 select count(DISTINCT ID) FROM TB
2、是其后所有字段。

我是杂学杂看来的,期待楼下补充详细材料


有没有讲解的特别细致的书籍或资料,谢谢。


sql server inside系列 有讲一点儿。lz可以参考看看。
另外就是外国大牛写的一些东西。 lz google一下吧。 


------解决思路----------------------
引用:
Quote: 引用:

1、distinct必须放在所有字段开头吗

是,必须这样做

2、distinct的限定范围,是紧随其后的那个字段,还是其后所有字段。

其后所有的字段,和 group by 的那种效果一样。只是处理方式不一样,group by 还能做其他的事。


有没有讲解的特别细致的书籍或资料,谢谢。


你可以到 MSDN 上看看,那里东西很多
http://msdn.microsoft.com/library/
------解决思路----------------------
http://technet.microsoft.com/en-us/library/ms176104(v=sql.110).aspx
看一下上面的technet上的语法表达式你的问题就应该很清楚了。

SELECT [ ALL 
------解决思路----------------------
 DISTINCT ]
[ TOP ( expression ) [ PERCENT ] [ WITH TIES ] ] 
<select_list> 
<select_list> ::= 
    { 
      * 
      
------解决思路----------------------
 { table_name 
------解决思路----------------------
 view_name 
------解决思路----------------------
 table_alias }.* 
      
------解决思路----------------------
 {
          [ { table_name 
------解决思路----------------------
 view_name 
------解决思路----------------------
 table_alias }. ]
               { column_name 
------解决思路----------------------
 $IDENTITY 
------解决思路----------------------
 $ROWGUID } 
          
------解决思路----------------------
 udt_column_name [ { . 
------解决思路----------------------
 :: } { { property_name 
------解决思路----------------------
 field_name } 
            
------解决思路----------------------
 method_name ( argument [ ,...n] ) } ]
          
------解决思路----------------------
 expression
          [ [ AS ] column_alias ] 
         }
      
------解决思路----------------------
 column_alias = expression 
    } [ ,...n ] 
------解决思路----------------------
distinct就是面向行级的取唯一记录的关键字
------解决思路----------------------
以前学习的时候,同学建议过一个书
http://item.jd.com/10080177.html

你可以先从电子版的去过下
------解决思路----------------------
  下面先来看看例子:
    table表
    字段1     字段2
    id        name
    1           a
    2           b
    3           c
    4           c
    5           b
    库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。
    比如我想用一条语句查询得到name不重复的所有数据,那就必须
    使用distinct去掉多余的重复记录。
    select distinct name from table
    得到的结果是:
    ----------
    name
    a
    c
    好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:
    select distinct name, id from table
    结果会是:
    ----------
    id name
    1 a
    2 b
    3 c
    4 c
    5 b
    distinct怎么没起作用?作用是起了的,不过他同时作用了两个
    字段,也就是必须得id与name都相同的才会被排除
    我们再改改查询语句:
    select id, distinct name from table
    很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。
    --------------------------------------------------------
    下面方法可行:
    select *, count(distinct name) from table group by name
    结果:
    id name count(distinct name)
    1 a 1
    2 b 1
    3 c 1
    最后一项是多余的,不用管就行了,目的达到
    group by 必须放在 order by 和 limit之前,不然会报错

------解决思路----------------------
(1)用于删除重复记录时,必须放在所有字段前面;若是聚合统计时,则放在聚合函数内所统计字段前面。
是其后所有字段。
(2)如果跟group by 一起使用,查询的效率会高一些。
  
------解决思路----------------------
1、distinct必须放在所有字段开头吗
 
distinct行级的,必须放在所有字段开头
 
2、distinct的限定范围,是紧随其后的那个字段,还是其后所有字段。
 
因为distinct是行级的,因此是其后所有的字段,虽然group by也有这种效果,但是,group by的主要用途还是分组查询。
  相关解决方案