0

疑わしいが確実ではない: FROM-clause 内のテーブルの単純なリストは定義上完全結合ですか?

SELECT * 
FROM table1, table2 

また、パラメーターが等しくないという条件でテーブルを結合している場合は、完全な外部結合の実装ですか? 例えば:

SELECT * 
FROM table1
JOIN table2
ON table1.id <> table2.id 

もう少し詳細、私はこれまでに見つけました:

"CROSS JOINデカルト積を返します" http://en.wikipedia.org/wiki/Join_(SQL)

結合するテーブルのリストは、次の方法で指定できます: "Table1, Table2, Table3,... これは最も単純な形式です。テーブルは、MySQL が最も効率的であると判断した方法で結合されます。この方法は、次のように記述することもできます。 Table1JOIN Table2 JOIN Table3,...キーワードCROSSも使用できますが、効果はありません (例Table1 CROSS JOIN Table2) 両方の列の条件に一致する行のみが結合されたテーブルに含まれます。" MySQL Pocket Reference、第 2 版、George Reese 著

したがって、最初のものは実際CROSS JOINにはテーブルの 、またはデカルト積のようです。

ここに画像の説明を入力

4

2 に答える 2

1

2 番目のクエリを調べてみましょう。

例として、次のテーブルを使用しています。

-- t1
id  name
1   Tim
2   Marta

-- t2
id  name
1   Tim
3   Katarina

重要: テーブル t1 のすべての主キーがテーブル t2 に存在するわけではありません。

CREATE TABLE `t1` (
  `id` int(11) NOT NULL,
  `name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `t2` (
  `id` int(11) NOT NULL,
  `name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `t1` VALUES (1,'Tim'),(2,'Marta');
INSERT INTO `t2` VALUES (1,'Tim'),(3,'Katarina');

次に、クエリを実行します。

SELECT * 
FROM t1
JOIN t2
ON t1.id <> t2.id 

結果セットは次のとおりです。

id    name   id   name
===========================
2     Marta  1    Tim
1     Tim    3    Katarina
2     Marta  3    Katarina

どうしたの?一致しないすべての組み合わせを選択しました!

FULL OUTER JOIN の定義を見てみましょう。

FULL OUTER JOINは、左右両方の外部結合の結果を結合し、テーブルの両側のテーブルからすべての (一致または不一致の) 行を返します。

OK、左右の外部結合の定義も必要です。

LEFT OUTER JOINは、右側のテーブルとの一致に関係なく、左側のテーブルからすべてのレコードを返します。

RIGHT OUTER JOINは、左側のテーブルとの一致に関係なく、右側のテーブルからすべてのレコードを返します。

これを手動で行いましょう:

LEFT OUTER JOIN は、左側のテーブルから Tim と Marta を返します。Tim のみが一致します。

id    name   id   name
===========================
1     Tim    1    Tim
2     Marta  NULL NULL

RIGHT OUTER JOIN は、右側のテーブルから tim と katarina を返します。Tim のみが一致します。

id    name   id   name
===========================
1     Tim    1    Tim
NULL  NULL   3    Katarina

これら 2 つを FULL OUTER JOIN に結合すると、次のようになります。

id    name   id   name
===========================
1     Tim    1    Tim
2     Marta  NULL NULL
NULL  NULL   3    Katarina

これは正しい結果セットです。MySQL では、これは左右の外部結合の UNION によって実行できます。

SELECT *
FROM `t1`
LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`

UNION

SELECT *
FROM `t1`
RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
于 2013-11-06T03:37:12.250 に答える
1

MySQL はまだFULL JOIN. それをエミュレートする1​​つの方法

SELECT a.id id0, t1.id id1, t2.id id2
  FROM
(
  SELECT id
    FROM table1
  UNION
  SELECT id
    FROM table2
) a LEFT JOIN table1 t1
   ON a.id = t1.id LEFT JOIN table2 t2
   ON a.id = t2.id;

これがSQLFiddle のデモです。このデモには、両方のクエリも含まれています。結果セットの違いを確認してください。

于 2013-11-06T03:13:26.777 に答える