SQL 2 INNER JOINS 与 3 个表

Posted

技术标签:

【中文标题】SQL 2 INNER JOINS 与 3 个表【英文标题】:SQL 2 INNER JOINS with 3 tables 【发布时间】:2012-06-13 16:49:56 【问题描述】:

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

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

产品 产品图片 照片

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)

谁能帮帮我?

【问题讨论】:

为什么要用括号? 如果你去掉括号你的查询是正确的。 @stmnmn 当有多个连接时,MS Access 中需要使用括号。诚然,括号放置不当,但不能完全移除。我不明白这些 cmets 的赞成票。 【参考方案1】:

这样的事情应该可以工作:

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];

【讨论】:

你只是复制我的答案吗?因为我不知道所有属性名称是否正确..您是否尝试删除自己查询中的括号?这真的应该工作。 @JelmerHoltes operator not... 什么?请张贴整个消息,不要自己修剪。 我测试过的另一个解决方案是: > SELECT title,prijs, bestandnaam FROM Product, Productfoto, Foto WHERE product.artikelnummer = productfoto.artikelnummer AND productfoto.foto_id = foto.foto_id 但是这个查询有两个问题: - 当一个产品有多个图像时,我只会显示其中一个,所以我必须将其限制为一个,但是如何?否则,我会得到三倍于不同图像的相同产品。 - 当一个产品没有图像时,它是不可见的..![附件,“Acqua di Gio homme 100 ml....”显示3次][1] [1]:i.stack.imgur.com/CTMze.png @JaneDoe 我的 Microsoft Access 是荷兰语,它说:“查询表达式 product.artikkelnummer = productfoto.artikelnummer inner join foto on foto.foto_id = productfoto.foto_i 中的 Syntaxisfout(运算符 ontbreekt)。” @JaneDoe 是的!我使用了向导(直到现在它才起作用),它创建了这个查询: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];现在它起作用了!但是.. 一个问题:我想每件产品只显示一张图片,我该怎么做?【参考方案2】:

关于使用链接表的一件事

ProductFoto 表确实允许 Product 和 Foto 之间的 N-M 关系。这是你真正想要/需要的吗?换句话说,一张 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 OUTERFULL INNERFULL OUTER

LEFT JOINOUTER 的使用是可选的)将包含左(第一)表中的所有记录,即使右(第二)表中没有相应的记录。 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/OUTERJOINs 时。


关于你的问题 使用类似于

的东西
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 切换到英语

【讨论】:

你犯了同样的错误,“artiKKel”:P 标签上写着 MS Access。你不能在 MS Access 中运行它,它会失败。 @Remou 为什么会失败,在那个(令人憎恶的)数据库中会有什么用? 你不能有两个没有括号的连接。 MS Access 对此非常挑剔(另请参阅我上面的评论)。

以上是关于SQL 2 INNER JOINS 与 3 个表的主要内容,如果未能解决你的问题,请参考以下文章

sql JOINs - JOIN,INNER JOIN,LEFT JOIN,RIGHT JOIN,CROSS JOIN

SQL SELF 和 INNER JOINS 在一个查询中

JOINS 的大型查询中的 SQL 子查询链

由 INNER JOIN-ing 3 个表产生的记录集不可更新

MySQL INNER JOIN 3 个表的计数和总数

SQL中inner join,outer join和cross join的区别