2010-10-25 127 views
1

普通SQL查詢與MS Access 2007查詢不同嗎?MS Access 2007疑難問題SQL查詢

我有這個簡單的查詢,但它不工作在MS Access查詢(SQL視圖)。這有什麼問題?

SELECT StudentSubject.*, Subject.*,Professor.*, Student.*, Church.* 
FROM 
(

SELECT StudentSubject.*, Subject.*,Professor.* , Student.* 
FROM 
(

SELECT StudentSubject.*, Subject.*,Professor.* 
FROM 
StudentSubject 
LEFT JOIN Subject ON StudentSubject.SubjectID=Subject.SubjectID 
INNER JOIN Professor ON Subject.ProfessorID=Professor.ProfessorID 

) 
    INNER JOIN Student ON StudentSubject.StudentID=Student.StudentID 
) 
LEFT JOIN Church ON Student.ChurchID=Church.ChurchID; 

我相信這會,如果我採用的是MySQL/MSSQL工作(如果我使用別名,直接做到這一點 - 這是毫秒的存取SQL設計的輸出中)

我得到的加入操作語法錯誤。但MS Access沒有指出哪個連接。

+1

你說的「不工作」是什麼意思? – RedFilter 2010-10-25 16:11:40

+0

是,MS Access使用其不同的T-SQL語法不太表現從SQL Server稍微(在某些結構中) – 2010-10-25 16:13:10

+0

@RedFilter我得到「加入操作語法錯誤」,如果你通過子字符串搜索沒有「不工作」在我的文章@米奇小麥你會介意翻譯這到TSQL – 2010-10-25 16:16:34

回答

1

是從MS Access 2007年不同尋常的查詢SQL查詢?

通過「普通的SQL」你大概的意思是入門級的SQL-92標準SQL(不管你知不知道!)

整體而言,接入(ACE,噴氣機,等等)不符合SQL-92。

具體而言,Access的JOIN語法不符合SQL-92。

在SQL-92中,一個或多個JOIN子句可以放在圓括號內以顯示優先級;沒有使用圓括號的所有JOIN子句將具有相同的優先級。

在Access中,每個JOIN子句必須自己括在圓括號內,但所有JOIN子句的優先級相同。

換句話說,訪問扼流圈標準語法和自己的語法比標準的:(

+0

感謝您提供非常詳細的答案 – 2010-10-26 17:27:46

2

它略有不同,但我不認爲該問題中的查詢可以在其他數據庫上工作 - 也有對子查詢中的表名的引用,這些引用不與別名匹配。

試試這個,而是:

SELECT StudentSubject.*, Subject.*,Professor.*, Student.*, Church.* 
FROM StudentSubject 
LEFT JOIN Subject ON StudentSubject.SubjectID=Subject.SubjectID 
INNER JOIN Professor ON Subject.ProfessorID=Professor.ProfessorID 
INNER JOIN Student ON StudentSubject.StudentID=Student.StudentID 
LEFT JOIN Church ON Student.ChurchID=Church.ChurchID; 

這仍然可能會返回一個錯誤,由於具有相同名稱不同的列 - 如果是這樣,就應該更換.*以上只是從每個表中所需的列,用適當的列別名。

+0

你是對的,我直接從MS Access編輯。在發佈問題之前,我已經嘗試了您的回答,但是我收到了一個奇怪的錯誤。語法錯誤(缺少操作符)'StudentSubject.SubjectID = Subject.SubjectID INNER JOIN教授ON Subject.ProfessorID = Professor.ProfessorID INNER JOIN Student ON StudentSubject.StudentID = Student.StudentID LEFT JOIN Church ON Student.ChurchID = Church.Church ' – 2010-10-25 16:24:10

+0

@geocine,您是否嘗試用每個表中只包含必需列的'。*'替換適當的列別名?有時返回的錯誤信息可能有點誤導。 – 2010-10-25 16:31:06

+0

是的,謝謝。但是,我找到了答案。 – 2010-10-25 16:40:16

2

加括號的伎倆

SELECT Subject.SubjectName,Professor.ProfessorName,Church.ChurchName,Student.StudentName 
FROM ((((StudentSubject LEFT JOIN Subject 
ON StudentSubject.SubjectID=Subject.SubjectID) 
INNER JOIN Professor ON Subject.ProfessorID=Professor.ProfessorID) 
INNER JOIN Student ON StudentSubject.StudentID=Student.StudentID) 
LEFT JOIN Church ON Student.ChurchID=Church.ChurchID); 
+0

這與您在問題中發佈的查詢不同。它可能很好地返回相同的數據,但是它的所有嵌套派生表子查詢都比原來的要複雜得多。 – 2010-10-27 21:37:00