1

我有三个表这样描述:

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

我不明白为什么“双重”自然连接不起作用。有谁可以帮助我解决这个问题?谢谢。

4

1 回答 1

1

这取决于您的数据,这是文档必须说明的内容

多路自然连接的评估在一个非常重要的方面有所不同,它会影响 NATURAL 或 USING 连接的结果,并且可能需要重写查询。假设您有三个表 t1(a,b)、t2(c,b) 和 t3(a,c),每个表都有一行:t1(1,2)、t2(10,2) 和 t3( 7,10)。还假设您在三个表上有这个 NATURAL JOIN:

选择 ... 从 t1 自然连接 t2 自然连接 t3;以前,第二个连接的左操作数被认为是 t2,而它应该是嵌套连接 (t1 NATURAL JOIN t2)。结果,仅在 t2 中检查 t3 的列是否有公共列,并且如果 t3 具有与 t1 的公共列,则这些列不会用作等连接列。因此,以前,前面的查询被转换为以下等值连接:

选择 ... 从 t1、t2、t3 哪里 t1.b = t2.b 和 t2.c = t3.c;该连接缺少一个等连接谓词 (t1.a = t3.a)。结果,它产生了一行,而不是它应该产生的空结果。正确的等效查询是这样的:

选择 ... 从 t1、t2、t3 哪里 t1.b = t2.b 和 t2.c = t3.c 和 t1.a = t3.a;

简而言之,第二个 JOIN 只检查前一个表的列,而不是第一个 JOIN 的整个结果。

不推荐使用 NATURAL JOIN 的原因之一,控制不多,收获也很少。

于 2015-10-20T08:01:55.737 回答