【问题标题】:Difference between Inner Join using multiple AND criteria vs multiple inner joins [duplicate]使用多个 AND 条件的内部联接与多个内部联接之间的区别 [重复]
【发布时间】:2017-11-12 16:20:08
【问题描述】:

我是 mysql 的新手。我必须加入两个表

我们称它们为 table_A 和 Table_B

我学会了使用以下代码进行内部连接表

SELECT *
FROM table_A a 
INNER JOIN table_B b
ON a.criteria_1 = b.criteria_1
AND a.criteria_2 = b.criteria_2
AND a.criteria_3 = b.criteria_3

今天我遇到了一个使用多个内部连接的查询

SELECT *
FROM table_A a 
INNER JOIN table_B b
ON a.criteria_1 = b.criteria_1
INNER JOIN table_B b1
ON a.criteria_2 = b1.criteria_2
INNER JOIN table_B b2
ON a.criteria_3 = b3.criteria_3

这两者有什么区别?

这是我第一次在这里写问题。

【问题讨论】:

  • 从读取 SQL 中的定义连接开始。通过一个例子来工作。部分运行代码。例如在 sqlfiddle.com。这是一个“自加入”。阅读相关内容。
  • 不同之处在于它会使您的查询难以管理。并且大量的连接会使您的查询的执行时间更长。你可以测试两个查询的执行时间,你会得到差异。
  • @NewazSharif:功能上也存在实际差异。
  • 好的。我明白了。结果也会不同。谢谢。 @塞尔吉奥·图伦采夫。
  • @SergioTulentsev PS 不幸的是,如果有一个 SO 答案除了在表运算符和值方面重申代码已经说过的内容之外,我会感到非常惊讶。 (并不是说这个问题很清楚;请参阅我对“差异”的评论。)甚至是教科书。语义上的关系阐述很差——它们会抛出示例查询的示例答案并希望你“明白”。因为我的回答,我给了那个副本。该问题发布在关系代数中,这是一个低流量的标签。 (但问答都涉及 SQL。)我只是用“sql”标记了重复项。)

标签: mysql join self-join


【解决方案1】:

几个不同之处,第一个查询将只返回 6 列第二个将返回 12,!st 查询所有条件必须匹配第二个查询任何可以。

DROP TABLE IF EXISTS A,B;

CREATE TABLE A (C1 INT, C2 INT, C3 INT);
CREATE TABLE B (C1 INT, C2 INT, C3 INT);

INSERT INTO A VALUES (1,1,1),(1,2,4);
INSERT INTO B VALUES (1,1,1),(1,2,3);

SELECT * FROM
A
JOIN B ON A.C1 = B.C1 AND A.C2 = B.C2 AND A.C3 = B.C3;

SELECT * 
FROM A 
JOIN B B1 ON A.C1 = B1.C1 
JOIN B B2 ON A.C2 = B2.C2 
JOIN B B3 ON A.C3 = B3.C3;

SELECT * FROM
    -> A
    -> JOIN B ON A.C1 = B.C1 AND A.C2 = B.C2 AND A.C3 = B.C3;
+------+------+------+------+------+------+
| C1   | C2   | C3   | C1   | C2   | C3   |
+------+------+------+------+------+------+
|    1 |    1 |    1 |    1 |    1 |    1 |
+------+------+------+------+------+------+
1 row in set (0.00 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> SELECT *
    -> FROM A
    -> JOIN B B1 ON A.C1 = B1.C1
    -> JOIN B B2 ON A.C2 = B2.C2
    -> JOIN B B3 ON A.C3 = B3.C3;
+------+------+------+------+------+------+------+------+------+------+------+------+
| C1   | C2   | C3   | C1   | C2   | C3   | C1   | C2   | C3   | C1   | C2   | C3   |
+------+------+------+------+------+------+------+------+------+------+------+------+
|    1 |    1 |    1 |    1 |    1 |    1 |    1 |    1 |    1 |    1 |    1 |    1 |
|    1 |    1 |    1 |    1 |    2 |    3 |    1 |    1 |    1 |    1 |    1 |    1 |
+------+------+------+------+------+------+------+------+------+------+------+------+
2 rows in set (0.00 sec)

【讨论】:

  • 谢谢伙计。非常感谢您的快速回复。
  • @MohamedAmar 这会运行您的查询。你为什么不呢?为什么要问问题?
  • 恐怕我听不懂你的说法。
猜你喜欢
  • 2016-12-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 2013-10-22
  • 2017-06-16
  • 2012-03-21
  • 2021-12-08
相关资源
最近更新 更多