簡體   English   中英

NATURAL JOIN無法正常運作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM