2012-06-10 46 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