1

早上好,MS Access 2016,加入多個表與複合鍵

我的第一個問題,所以赦免一些不良形式,如果存在。

我目前有三個表(table1,table2,table3),所有這些表都有一個複合主鍵(model-number,serial-number)。其意圖在於將各方之間的序列號相關的數據拆分,其中一些數據比其他數據更有價值,這取決於誰在查看它。組合主鍵共享一對一關係,t1中的鍵與t2中的鍵相關,t2中的鍵與t3中的鍵相關。

我想寫一個查詢,從序列號的所有三個表中提取數據。我在印象之下做到這一點的最佳方式是使用INNER JOIN。該代碼我有多遠......

SELECT 
    t1.[model-number], 
    t1.[serial-number], 
    t1.[track], 
    t1.[data], --placeholder for data columns 
    t2.[data], --placeholder for data columns 
    t3.[data] --placeholder for data columns 
FROM [table1] t1 
LEFT JOIN [table2] t2 
    ON t2.[model-number] = t1.[model-number] AND t2.[serial-number] = t1.[serial-number] 
LEFT JOIN [table3] t3 
    ON t3.[model-number] = t2.[model-number] AND t3.[serial-number] = t2.[serial-number] 
WHERE t1.[track] = TRUE 
ORDER BY t1.[model-number], t1.[serial-number] DESC; 

然而,當我運行查詢,MS訪問給我的錯誤:

Syntax error (missing operator) in query expression "".

我試過到目前爲止:

  1. T1的順序相反。[模型數] = T2。[模型號]等...
  2. 添加/圍繞T1/T2/T3別名卸下方括號
  3. 完全刪除WHERE語句
  4. 將「AS」放在表別名標註的前面(即, LEFT JOIN [table1] AS t1)
  5. 減少所有數據,以便每個表中只有一個字段被引用(如果我在原始嘗試中調出的30列中的某處出現明顯的語法錯誤)

另外,在我解除錯誤之後,文本光標回到「t2。[」,在第一個LEFT JOIN的後半部分。

所有這一切說,我找不到語法錯誤。我錯過了明顯的東西嗎?

在此先感謝!這個論壇真的幫助我建立這個數據庫。

AC

每下面的評論,我刪除了第二LEFT JOIN,因此代碼閱讀是這樣的:

SELECT 
    t1.[model-number], 
    t1.[serial-number], 
    t1.[track], 
    t1.[data], --placeholder for data columns 
    t2.[data], --placeholder for data columns 
FROM [table1] t1 
LEFT JOIN [table2] t2 
    ON t2.[model-number] = t1.[model-number] AND t2.[serial-number] = t1.[serial-number] 
WHERE t1.[track] = TRUE 
ORDER BY t1.[model-number], t1.[serial-number] DESC; 

這導致查詢來運行,所以有事情發生的兩個左聯接。我添加了第二LEFT JOIN回來....

SELECT 
    t1.[model-number], 
    t1.[serial-number], 
    t1.[track], 
    t1.[data], --placeholder for data columns 
    t2.[data], --placeholder for data columns 
    t3.[data] 
FROM [table1] t1 
LEFT JOIN [table2] t2 
    ON t2.[model-number] = t1.[model-number] AND t2.[serial-number] = t1.[serial-number] 
LEFT JOIN [table3] t3 
    ON t3.[model-number] = t2.[model-number] AND t3.[serial-number] = t2.[serial-number] 
WHERE t1.[track] = TRUE 
ORDER BY t1.[model-number], t1.[serial-number] DESC; 

....用SELECT語句從表一列,它給了我這個錯誤。在連續的JOIN子句之間是否有我缺少的語法?

+0

我想你需要一個'FROM'子句以及你要返回的字段之間的逗號。除非這只是你正在運行的一個片段... – Forty3

+0

在原來的文章中,我意外地輸入了「GROUP BY」而不是「ORDER BY」 - 我在代碼示例中修復了這個問題。我的錯。 – andrewec

+0

也是我的錯!我在我的實際代碼中有一個FROM子句和逗號 - 我將編輯帖子以反映它。 – andrewec

回答

1

訪問顯然需要JOIN的是...我不知道這個詞是什麼(互斥也許):

SELECT 
    t1.[model-number], 
    t1.[serial-number], 
    t1.[track], 
    t1.[data], 
    t2.[data], 
    t3.[data] 
FROM (
     [table1] t1 
     LEFT JOIN [table2] t2 
      ON (t2.[model-number] = t1.[model-number]) 
      AND (t2.[serial-number] = t1.[serial-number]) 
    ) 
    LEFT JOIN [table3] t3 
     ON (t3.[model-number] = t2.[model-number]) 
     AND (t3.[serial-number] = t2.[serial-number]) 
WHERE t1.[track] = TRUE 
ORDER BY t1.[model-number], t1.[serial-number] DESC; 

注意額外的括號T1和T2之間的連接?似乎有必要。

注 - 我發現的方式是使用連接組合鍵上的表的查詢設計窗口,並將屬性更改爲LEFT(即左表中的所有行和只匹配右表中的行),然後看着生成的SQL。

+0

順便說一句:一定要刪除以'--'開頭的註釋,因爲Access不喜歡那些。 – Forty3

+0

感謝您的額外評論。我的訪問代碼中沒有他們,在我的嘗試中早些時候遇到了這個錯誤:)括號似乎工作!我想我明白那裏發生了什麼,但我會繼續嘗試一些其他的問題,我必須寫。下一步是加入另一張桌子......希望同樣的技術能夠發揮作用。 – andrewec