SQL 2 INNER JOINS有3个表

时间:2012-06-10 13:10:12

标签: c# asp.net sql ms-access inner-join

我有一个关于SQL查询的问题..我正在ASP.NET Visual Studio中构建原型网上商店。现在我正在寻找一种查看我的产品的解决方案。我在MS Access中构建了一个数据库,它由多个表组成。

对我的问题很重要的表是:

  • 产品
  • 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

我已经创建了第一个内部联接,并在Access中进行了测试,这可行:

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)

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分:1)

关于使用链接表的一件事

ProductFoto表允许产品和Foto之间的N-M关系。这是你真正想要/需要的吗?换句话说,一个Foto可以属于多个产品吗?如果没有,请将Product_Id放在Foto表中。如果是这样,......

...让我们讨论加入。

假设我们有两个表,A和B.做一个

SELECT * FROM A, B

将为您提供A行与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实际上是LEFT OUTERRIGHT OUTERFULL INNERFULL OUTER加入的。

  • LEFT JOIN(使用OUTER是可选的)将包含左(第一)表中的所有记录,即使右(第二)表中没有相应的记录也是如此。
  • RIGHT JOIN显然以相同的方式工作,但是镜像。
  • 使用FULL OUTER JOIN两个表都是可选的(尽管与SELECT * FROM A, B不完全相同!)。
  • 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 /时OUTER JOIN s。


关于您的问题 使用

的内容
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(或LIMIT 1,取决于您的数据库)来“修复”这个。

Veel成功,en doe jeeelf een plezier en 切换到英语