我有三个表格描述:
+----------+ +-----------------+ +----------+
| products | | products_stores | | stores |
+----------+ +-----------------+ +----------+
| barecode | | #barecode | | storeID |
| name |----| #storeID |----| location |
+----------+ | price | +----------+
+-----------------+
像这样创建它们:
CREATE TABLE IF NOT EXISTS `products` (
`barecode` varchar(100) NOT NULL UNIQUE,
`name` varchar(25) NOT NULL,
PRIMARY KEY (`barecode`)
);
CREATE TABLE IF NOT EXISTS `stores` (
`idStore` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(25) NOT NULL,
`location` varchar(100) NOT NULL,
PRIMARY KEY (`idStore`)
);
CREATE TABLE IF NOT EXISTS `products_stores` (
`idStore` int(10) NOT NULL,
`barecode` VARCHAR(100) NOT NULL,
`price` double NOT NULL,
FOREIGN KEY (`barecode`) REFERENCES `products`(`barecode`),
FOREIGN KEY (`idStore`) REFERENCES `stores`(`idStore`)
);
我想通过正确的商店获得所有产品及其价格,所以我尝试了NATURAL JOIN,但它没有返回任何内容(代码低于1-)。所以我尝试只用一个NATURAL JOIN来检查它是否有效(代码低于2-和3-)。
1- SELECT * FROM products NATURAL JOIN products_stores NATURAL JOIN stores;
2- SELECT * FROM products JOIN products_stores NATURAL JOIN stores;
3- SELECT * FROM products NATURAL JOIN products_stores JOIN stores;
我不明白为什么" double" NATURAL JOIN不起作用。有没有人可以帮我解决这个问题? 谢谢。
答案 0 :(得分:1)
这取决于您的数据,以下是documentation对此所说的内容
多路自然连接的评估非常重要 影响NATURAL或USING连接结果的方式可以 需要查询重写。假设你有三个表t1(a,b), t2(c,b)和t3(a,c)各有一行:t1(1,2),t2(10,2),和 T3(7,10)。假设你在这三个上有这个NATURAL JOIN 表:
SELECT ... FROM t1 NATURAL JOIN t2 NATURAL JOIN t3;以前, 第二次连接的左操作数被认为是t2,而它 应该是嵌套连接(t1 NATURAL JOIN t2)。结果, 仅在t2中检查t3的列以查找公共列,并且如果t3则检查 具有t1的公共列,这些列不用作equi-join 列。因此,先前,先前的查询被转换为 在equi-join之后:
SELECT ... FROM t1,t2,t3 WHERE t1.b = t2.b AND t2.c = t3.c; 该连接缺少一个等连接谓词(t1.a = t3.a)。作为一个 结果,它产生一行,而不是它应该的空结果。该 正确的等效查询是:
SELECT ... FROM t1,t2,t3 WHERE t1.b = t2.b AND t2.c = t3.c AND t1.a = t3.a;
简而言之,第二个JOIN仅检查上一个表的列而不是第一个JOIN的整个结果。
不推荐使用NATURAL JOIN的原因之一,没有太多的控制,也没有什么好处。