[英]NATURAL JOIN does not work properly
我有三個表描述像這樣:
+----------+ +-----------------+ +----------+
| 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;
我不明白為什么“雙”自然聯接不起作用。 有人可以幫助我嗎? 謝謝。
這取決於您的數據,這是文檔必須說明的內容
多向自然聯接的評估在一個非常重要的方面有所不同,這會影響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 AND t2.c = t3.c; 該聯接缺少另一個等聯接謂詞(t1.a = t3.a)。 結果,它產生一行,而不是它應為空的結果。 正確的等效查詢是這樣的:
從t1,t2,t3中選擇... ... t1.b = t2.b AND t2.c = t3.c AND t1.a = t3.a;
簡而言之,第二個JOIN僅檢查上一個表的列,而不檢查第一個JOIN的整個結果。
不推薦使用NATURAL JOIN的原因之一是控制不多,獲得的收益也很少。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.