1

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

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

  • 产品
  • 产品图片
  • 照片

下面你会看到表之间的关系

对我来说,获取三种数据类型很重要:产品标题、价格和图像。产品名称和价格在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)

谁能帮我?

4

2 回答 2

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];
于 2012-06-10T13:13:39.250 回答
1

关于使用链接表的一件事

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

...让我们讨论 JOIN。

假设我们有两张桌子,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

JOINs 实际上进来了LEFT OUTERRIGHT OUTER并且FULL INNERFULL OUTER加入了。

  • A LEFT JOIN(使用 ofOUTER是可选的)将包含左(第一)表中的所有记录,即使右(第二)表中没有相应的记录。
  • ARIGHT JOIN显然以相同的方式工作,但镜像。
  • 使用 aFULL OUTER JOIN两个表都是可选的(虽然不完全相同SELECT * FROM A, B!)。
  • AFULL INNER需要匹配两个表中的记录(这是默认设置)。

当你确实想做不止一个JOIN时,说

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

你可以把 extra 想象JOIN成一个中间表的连接,由连接 A 和 B 形成,尤其是在混合一些LEFT/ RIGHT/ INNER/ OUTER JOINs 时。


至于你的问题, 使用类似的东西

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 jezelf een plezier en switch to English

于 2012-06-10T15:46:53.633 回答