NATURAL JOIN无法正常工作

时间:2015-10-20 07:37:06

标签: mysql join natural-join

我有三个表格描述:

+----------+    +-----------------+    +----------+ 
| 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不起作用。有没有人可以帮我解决这个问题? 谢谢。

1 个答案:

答案 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的原因之一,没有太多的控制,也没有什么好处。