2012-06-10 73 views
1

我有一個關於SQL查詢的問題..我在ASP.NET Visual Studio中構建了一個原型webshop。現在我正在尋找解決方案來查看我的產品。我已經在MS Access中構建了一個數據庫,它由多個表組成。SQL 2內部聯接3表

這是我的問題很重要的表是:

  • 產品
  • Productfoto
  • 圖片

Below you'll see the relations between the tables

對於我來說,拿到三個數據類型是非常重要的:產品標題,價格和圖像。 產品標題和價格位於Product表中。圖像位於Foto表格中。

由於產品可以有多個圖片,因此它們之間存在N - M關係。所以我必須把它分開,我在Productfoto表中做過。

所以它們之間的連接是:

product.artikelnummer -> productfoto.artikelnummer 
productfoto.foto_id -> foto.foto_id 

然後我可以讀取的文件名(在數據庫:foto.bestandnaam

我創建了第一個內部聯接,並在存取測試它,這個工程:

SELECT titel, prijs, foto_id 
FROM Product 
INNER JOIN Productfoto 
ON product.artikelnummer = productfoto.artikelnummer 

但我需要另一個INNER JOIN,我怎麼能創造?我猜這樣的事情(這一次會給我一個錯誤)

SELECT titel, prijs, bestandnaam 
FROM Product 
((INNER JOIN Productfoto ON product.artikelnummer = productfoto.artikkelnummer) 
INNER JOIN foto ON productfoto.foto_id = foto.foto_id) 

任何人都可以幫助我嗎?

+3

你爲什麼要用括號? –

+1

如果您刪除括號,您的查詢是正確的。 – Ben

+1

@stmnmn當有多個連接時,括號在MS Access中是必需的。無可否認,支架放置不當,但無法完全去除。我不明白這些評論的讚揚。 – Fionnuala

回答

3

這樣的事情應該工作:

SELECT Product.titel, Product.prijs, Foto.bestandnaam FROM Product INNER JOIN 
(Foto INNER JOIN Productfoto ON Foto.[foto_id] = Productfoto.[foto_id]) ON 
Product.[artikelnummer] = Productfoto.[artikelnummer]; 
+0

它說:語法錯誤(操作符不是.......) –

+0

你只是複製我的答案?因爲我不知道所有的屬性名稱是否正確..你嘗試刪除自己的查詢中的括號嗎?這真的應該工作。 – Thousand

+0

@JelmerHoltes'操作員不... ...'*什麼?*請發佈整個消息,不要自己修剪它。 – Seph

1

一件事有關使用鏈接表

的ProductFoto表允許產品和圖片之間確實N-M的關係。這是你真正想要/需要的嗎?換句話說,一個Foto是否可以屬於多個產品?否則,將Product_Id放在Foto表上。如果是這樣,...

...讓我們來討論JOIN。

假設我們有兩個表A和B.做

SELECT * FROM A, B 

會給你的行的所有排列與B的行。我們可以通過添加一個WHERE子句來限制結果集,如WHERE A.a='lekker hoor!'或者一種冷卻器WHERE A.id=B.a_id。其實開始看起來像一個JOIN結果!

讓我們做一個適當的JOIN則:

SELECT * FROM A JOIN B ON A.id=B.a_id 

JOIN 5事實上進來LEFT OUTERRIGHT OUTERFULL INNERFULL OUTER連接。

  • 一個LEFT JOIN(使用OUTER是可選的)將包含所有記錄在左邊(第一)表,即使是在正確的(第二)表中沒有相應的記錄(一個或多個)。
  • A RIGHT JOIN顯然是以相同的方式工作,但鏡像。
  • 隨着FULL OUTER JOIN兩個表是可選的(不太雖然一樣SELECT * FROM A, B!)。
  • A FULL INNER需要兩個表中的匹配記錄(這是默認值)。

當你想要做的不止一個JOIN,說

SELECT * FROM 
    A 
    JOIN B ON A.id=B.a_id 
    JOIN C ON B.id=C.b_id 

你能想到的額外JOIN爲加入上的中間表,通過連接A和B,特別是混合一些時候形成LEFT/RIGHT/INNER/OUTERJOIN秒。


至於你的問題 使用的東西沿着

SELECT TOP (1) titel, prijs, bestandnaam 
FROM 
(-- this bracket is MS Access specific (and awkward) 
    Product 
    INNER JOIN Productfoto ON product.artikelnummer = productfoto.artikelnummer 
) -- this one too 
    INNER JOIN foto ON productfoto.foto_id = foto.foto_id 
  • 線,以滿足MS Access中,圍繞前兩個表使用括號,見Ms-Access: Join 3 Tables
  • 通常不需要支架(當你發現性感的子選擇時,你會這樣使用它們,規則是:只有在沒有其他選擇時才使用它們)。
  • 由於您的ProductFoto表中有多個匹配項,因此結果中會有多個匹配項。使用TOP 1(或限制1,取決於你的數據庫)'修復'這個。

Veel成功,en doe jezelf een plezier en 切換到英語

+0

你犯了同樣的錯誤,「artiKKel」:P – Thousand

+0

因爲我複製了它:D lol – jos

+0

標籤說MS Access。你不能在MS Access中運行它,它會失敗。 – Fionnuala