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];
【讨论】:
你只是复制我的答案吗?因为我不知道所有属性名称是否正确..您是否尝试删除自己查询中的括号?这真的应该工作。 @JelmerHoltesoperator 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
JOIN
s 实际上加入了LEFT OUTER
、RIGHT OUTER
和FULL INNER
或FULL 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 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