如果链接表存储在SQL 2008-Server上,则MS-Access DISTINCTROW不再起作用

时间:2011-03-06 12:35:44

标签: sql-server-2008 ms-access

我在MS-Access中有这样的查询:

select DISTINCTROW companies.* from companies, contacts, companies left join contacts on contacts.com_uid = companies.com_uid (This is the ms-access form of a standard "left-join")

[公司]和[联系人]是sql-server 2008上的链接视图,ODBC驱动程序是“SQL server native client 10.0”。这两个视图看起来像“select * from [companies] deleted = 0”和“select * from [contacts] where delete = 0”

结果是错误的,因为公司显示的联系人数量很多。

如果视图存储在SQL2000上并与ODBC驱动程序“SQL Server”链接,一切都很好:所有公司都只显示一次。

是否有任何解决方案可以再次使用DISTINCTROW获得结果?

3 个答案:

答案 0 :(得分:0)

我很惊讶它执行该查询。您要两次指定“联系人”表。

你的LEFT JOIN应该从“公司”返回每一行。由于您没有从联系人中检索任何列,因此我非常确定您的查询等同于

SELECT * 
FROM companies

只要“公司”意味着用普通语言做什么。

如果结果不是这样,您可以通过在SQL Server中创建视图或在Access中创建passthrough query来减轻SQL Server的负担。必须使用服务器的SQL方言(SQL Server 2008方言SQL)编写直通查询。


以下转载的修订版没有改变我之前的评论。

select DISTINCTROW companies.* 
from companies, contacts, companies 
left join contacts on contacts.com_uid = companies.com_uid 
(This is the ms-access form of a standard "left-join")

那是不是 Access的左连接形式。访问不允许这样:

from companies, contacts, companies 
left join contacts

因为您现在两次指定两个表。

根据您的编辑,我会说您尝试编写的查询仍然等同于

SELECT * 
FROM companies

如果你运行 ,你会得到什么?

答案 1 :(得分:0)

让我们停止讨论ms-access中左连接的语法。事实是,如果链接表是sql-server 2000上的视图:

create view [companies] as
select * from [TabCompanies] where deleted  = 0

create view [contacts] as
select * from [TabContcts] where deleted = 0

这些视图是ms-access 2003/2007 mdb中的ODBC链接表。 问题显示在ms-access上,如

之类的查询
select distinctrow [companies].* from [companies] left join [contacts] on [companies].com_uid = contacts.com_uid] where [contacts].[function] like 'C*'

(让我们忘记替代语法并假设左连接在没有错误或语法错误的情况下工作时查看结果)

这个DISTINCTROW是一个ms访问功能,在sql-server中不知道,对于我的观点,结果与DISTINCT相同,但即使存在具有图像数据类型的列,例如也可以。

我们现在期望像Catcall一样在他的回答中说“选择*来自公司”,但不是,为什么?

这只是整个查询的摘录,可能对生产毫无意义,但它显示了sql2008已连接的已更改行为。

答案 2 :(得分:0)

DISTINCTROW的目的是使N:1连接的两边可编辑。使用笛卡尔积(from companies, contacts, companies),结果无法编辑,因此DISTINCTROW没有优于DISTINCT的优势。

其次,无论你说什么,在没有别名的FROM子句中都不可能有两次相同的表。您发布的SQL无法在任何版本的Access中使用。

我能想象的唯一方法是,如果你省略了WHERE子句,那么你发布的内容是否有任何意义。

基于评论的编辑:

这应该有效:

  SELECT DISTINCT companies.*
  FROM companies INNER JOIN contacts ON companies.com_uid = contacts.com_uid
  WHERE contacts.function LIKE "C*"

首先,我假设contacdts和公司之间存在正常的N:1关系(即,许多联系人记录链接到任何单个公司记录),因此对于FROM子句中的两个表,您需要一个DISTINCT为每家公司返回一行。

其次,如果你在JOIN的许多方面的表上放置标准,没有理由尝试使用LEFT JOIN,因为它不会改变返回的记录(当你想要返回时使用LEFT JOIN无论JOIN的多方面表格中是否有记录,记录都是如此。因此,INNER JOIN将为您完成工作,并且效率更高(外部JOIN只是更慢,即使有标准)。