1

そのように説明する3つのテーブルがあります:

+----------+    +-----------------+    +----------+ 
| 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- 以下のコード)。だから私はチェックするために1つのNATURAL JOINだけで試してみました.

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 JOIN が機能しない理由がわかりません。誰かがこれを通して私を助けることができますか? ありがとう。

4

1 に答える 1

1

それはあなたのデータに依存します、これはドキュメントがそれについて言わなければならないことです

多方向自然結合の評価は、NATURAL または USING 結合の結果に影響し、クエリの書き換えが必要になる可能性がある非常に重要な点で異なります。t1(1,2)、t2(10,2)、および t3( 7,10)。また、3 つのテーブルに次の NATURAL JOIN があるとします。

SELECT ... FROM t1 自然結合 t2 自然結合 t3; 以前は、2 番目の結合の左側のオペランドは t2 と見なされていましたが、ネストされた結合 (t1 NATURAL JOIN t2) である必要があります。その結果、t3 の列は t2 でのみ共通の列についてチェックされ、t3 に t1 との共通の列がある場合、これらの列は等結合列として使用されません。したがって、以前は、前述のクエリは次の等結合に変換されていました。

SELECT ... FROM t1, t2, t3 WHERE t1.b = t2.b AND t2.c = t3.c; その結合には、もう 1 つの等結合述語 (t1.a = t3.a) がありません。その結果、空の結果ではなく、1 行が生成されます。正しい同等のクエリは次のとおりです。

SELECT ... FROM t1, t2, t3 WHERE t1.b = t2.b AND t2.c = t3.c AND t1.a = t3.a;

つまり、2 番目の JOIN は、最初の JOIN の結果全体ではなく、前のテーブルの列のみをチェックします。

NATURAL JOIN が推奨されない理由の 1 つは、あまり制御できず、得られるものがほとんどないことです。

于 2015-10-20T08:01:55.737 に答える