簡體   English   中英

如果鏈接表存儲在SQL2008-Server上,則MS-Access DISTINCTROW不再起作用

[英]MS-Access DISTINCTROW dosen't work anymore if linked tables a stored on SQL2008-Server

我在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本機客戶端10.0”。 這兩個視圖看起來都像是“從*刪除= 0的[公司]中選擇*”和“從0刪除= 0的[聯系人]中選擇*”

結果是錯誤的,因為公司顯示了盡可能多的聯系人。

如果將視圖存儲在SQL2000上並與ODBC驅動程序“ SQL Server”鏈接,則一切正常:所有公司僅顯示一次。

有什么解決方案可以再次使用DISTINCTROW獲得結果?

我很驚訝它完全執行了該查詢。 您要兩次指定表“聯系人”。

您的LEFT JOIN應該返回“ companies”的每一行。 由於您沒有從聯系人中檢索任何列,因此我很確定您的查詢等同於

SELECT * 
FROM companies

只要“公司”是指其用普通語言所做的工作。

如果證明不是這樣的話,你可以通過創建SQL Server中的視圖,或通過創建一只手的負擔過到SQL Server 直通查詢的訪問。 必須使用服務器的SQL方言(SQL的SQL Server 2008方言)編寫直通查詢。


您的修訂(復制於下)對更改我之前的評論沒有任何作用。

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

如果運行會得到什么?

讓我們停止談論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-access的一項功能,在sql-server中不知道,從我的角度來看,結果與DISTINCT相同,但即使存在數據類型為image的列,示例也可以使用。

到目前為止,我們都希望像Catcall一樣在他的回答中說“從公司中選擇*”,但事實並非如此,為什么?

這只是整個查詢的摘錄,對於生產來說可能沒有任何意義,但它顯示了與sql2008連接時已更改的行為。

DISTINCTROW的目的是使N:1連接的兩側可編輯。 使用笛卡爾積( from companies, contacts, companies ),結果不可編輯,因此DISTINCTROW與DISTINCT相比沒有優勢。

其次,不管你說什么,它是不可能有相同的表兩次FROM子句中沒有別名。 您發布的SQL不能在訪問的任何版本都工作過。

我能想象可能有一個在你張貼的內容意義上的唯一方法是,如果你省略WHERE子句。

根據評論進行編輯:

這應該工作:

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

首先,我假設污染物和公司之間存在正常的N:1關系(即,許多聯系記錄都鏈接到任何單個公司記錄),因此對於FROM子句中的兩個表,您確實需要DISTINCT來返回單個每個公司一行。

其次,如果將條件放在JOIN的多個表上,則沒有理由嘗試使用LEFT JOIN,因為它不會更改返回的記錄(當您想返回記錄而無論表格中是否在JOIN的許多方面都有記錄)。 因此,INNER JOIN將為您完成這項工作,並且效率更高(即使具有條件,外部JOIN也會更慢)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM