Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

distinct 和 distinctrow 有何区别?

baiqingrui  发表于:2014-12-05 14:28:26  
复制

distinct 和 distinctrow 有何异同?我试了一下,没看出来。

 

Top
cspa 发表于:2014-12-05 14:52:23

以下来自access帮助:

UniqueRecords 属性

参阅应用于示例特性

使用 UniqueRecords 属性可以指定是否只返回唯一记录,该记录基于所有基础数据来源中的全部字段,而不仅仅基于查询中出现的那些字段。

注释  UniqueRecords 属性仅应用于追加查询生成表查询选择查询

设置

UniqueRecords 属性使用以下设置:

设置 说明
不返回重复记录。
(默认值)返回重复记录。

可以在查询的属性表中,或在“查询”窗口“SQL”视图中设置 UniqueRecords 属性。

注释  在使用 SQL 语句新建查询时,可以设置该属性。DISTINCTROW 谓词对应于 UniqueRecords 属性设置;DISTINCT 谓词对应于 UniqueValues 属性设置。


说明

如果需要忽略的是基于整个重复记录的数据,而不仅仅是重复字段时,可以使用 UniqueRecords 属性。只要记录中某一字段值与另一个记录中同一字段的值不同,Microsoft Access 都将记录视为唯一的。

UniqueRecords 属性只有当在查询中使用多个表,并且从这些表中选择了用于查询的字段时才有效。如果查询只包含一个表,将忽略 UniqueRecords 属性。

UniqueRecordsUniqueValues 属性相互联系,一次只能将它们中一个设为“是”。例如,当将 UniqueRecords 设置为“是”时,Microsoft Access 自动将 UniqueValues 设为“否”。不过,可以将它们两者都设置为“否”。当两个属性都被设置为“否”时,将返回所有的记录。

示例

该示例中的查询从“客户”表中返回那些在“订单”表中至少有一个订单的客户列表。

“客户” 表

公司名称 客户ID
Ernst Handel ERNSH
Familia Arquibaldo FAMIA
FISSA Fabrica Inter. Salchichas S.A. FISSA
Folies gourmandes FOLIG

“订单”表

客户ID 订单ID
ERNSH 10698
FAMIA 10512
FAMIA 10725
FOLIG 10763
FOLIG 10408

下面的 SQL 语句返回下表中的客户名称;

SELECT DISTINCTROW Customers.CompanyName, Customers.CustomerID
FROM Customers INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
返回的客户 客户ID
Ernst Handel ERNSH
Familia Arquibaldo FAMIA
Folies gourmandes FOLIG

 



baiqingrui 发表于:2014-12-06 09:11:46

还是没弄明白,我又试了一下,下面这两种结果,为什么是这样??


SELECT DISTINCT 客户.公司名称, 订单.客户ID
FROM 客户 INNER JOIN 订单 ON 客户.客户ID = 订单.客户ID;



公司名称 客户ID
Ernst Handel ERNSH
Familia Arquibaldo FAMIA
Folies gourmandes FOLIG


SELECT DISTINCTROW 客户.公司名称, 订单.客户ID
FROM 客户 INNER JOIN 订单 ON 客户.客户ID = 订单.客户ID;



公司名称 客户ID
Ernst Handel ERNSH
Familia Arquibaldo FAMIA
Familia Arquibaldo FAMIA
Folies gourmandes FOLIG
Folies gourmandes FOLIG




baiqingrui 发表于:2014-12-06 09:29:04
我把“订单”表里的第一行复制粘贴,变成重复的数据。 用了上面DISTINCTROW语句之后的查询结果还是有重复行的。好像DISTINCTROW没起到什么作用

cspa 发表于:2014-12-06 20:15:15

注意:
1,使用 UniqueRecords 属性可以指定是否只返回唯一记录,但该记录基于所有基础数据来源中的全部字段,而不仅仅基于查询中出现那些字段


SELECT DISTINCT 客户.公司名称, 订单.客户ID
FROM 客户 INNER JOIN 订单 ON 客户.客户ID = 订单.客户ID;
中,你使用的是 DISTINCT 谓词,因此,只显示客户.公司名称, 订单.客户ID 2个字段不同的记录,重复的都不显示。

而在
SELECT DISTINCTROW 客户.公司名称, 订单.客户ID
FROM 客户 INNER JOIN 订单 ON 客户.客户ID = 订单.客户ID;
中,你使用的是 DISTINCTROW 谓词,此时客户表和订单表的所有字段都参加比较,有一个字段不同就显示

FAMIA 有2个不同的订单号(10512,10725),FOLIG也有2个不同的订单号(10763,10408)。所以虽然订单号不在你的查询字段内,access也认为这些记录是不同的,它们(FAMIA和FOLIG)也都要被显示2次。

简而言之,DISTINCT的作用范围仅是查询中出现的那些字段;DISTINCTROW的作用范围是查询所涉及的所有基础数据来源中的全部字段,无论字段是否在查询中出现。

 

2,UniqueRecords 属性只有当在查询中使用多个表,并且从这些表中选择了用于查询的字段时才有效。如果查询只包含一个表,将忽略 UniqueRecords 属性。
也就是说,当你用订单表一个表使用DISTINCTROW谓词时是无效的。

所以会出现“我把“订单”表里的第一行复制粘贴,变成重复的数据。 用了上面DISTINCTROW语句之后的查询结果还是有重复行的。好像DISTINCTROW没起到什么作用



总记录:4篇  页次:1/1 9 1 :