【问题标题】:Which table exactly is the "left" table and "right" table in a JOIN statement (SQL)?JOIN 语句 (SQL) 中的“左”表和“右”表到底是哪个表?
【发布时间】:2011-05-05 19:31:38
【问题描述】:

是什么让给定的表成为左表?

是不是在查询的“From”部分中指明了表?

或者,它是左表,因为它位于 = 运算符的左侧?

以下是等价的吗

SELECT *
FROM left_table
LEFT JOIN right_table ON left_table.right_id = right_table.id

SELECT *
FROM left_table
LEFT JOIN right_table on right_table.left_id = left_table.id

???

谢谢

【问题讨论】:

  • 您的第二个查询似乎令人困惑,为什么不写:SELECT * FROM left_table LEFT JOIN right_table on right_table.id = left_table.right_id

标签: sql join


【解决方案1】:

大致“左”是从左到右读取时出现在整个 FROM 子句中的所有内容的结果 - 包括其他 JOIN、子查询、视图和存储过程的结果。

两个 SQL 语句是等价的,因为 JOIN 子句的 ON 部分的 = 运算符是 symmetric(如果 a = b 则 b = a),因此无论顺序如何,结果都是相同的.

常规连接仅显示 JOIN 的 ON 子句为真的行,而如果条件为假,LEFT JOIN 还显示“左”的记录(显示“右”中存在的任何列的 NULL选择)。

例如:

-- People:           -- Car
id | name            owner_id | model
---+------------     ---------+------------
1  | Paul            1        | Ferrari
2  | Nancy           2        | Porsche
3  | Arthur          NULL     | Lamborghini
4  | Alfred          10       | Maserati

> select people.name, car.model from people join car on car.owner_id=people.id;

name     | model
---------+--------------
Paul     | Ferrari
Nancy    | Porsche
2 record(s) found

> select people.name, car.model from people left join car on 
  car.owner_id=people.id;

name     | model
---------+--------------
Paul     | Ferrari
Nancy    | Porsche
Arthur   | NULL
Alfred   | NULL     
4 record(s) found

> select people.name, car.model from people left join car on 
  people.id = car.owner_id;

name     | model
---------+--------------
Paul     | Ferrari
Nancy    | Porsche
Arthur   | NULL
Alfred   | NULL     
4 record(s) found

【讨论】:

  • 这不是问题。
【解决方案2】:

左表是选择中的第一个表。是的,你的两个例子是等价的。

【讨论】:

  • 这需要澄清。 “选择中的第一个表”是什么意思?
  • 我觉得应该说“左表是FROM子句中的第一个表”
【解决方案3】:

正确的表始终是您要加入的表。所以是的,你的两个陈述都是等价的。

JOIN [Table] ON ...

[Table] 始终是正确的表。

【讨论】:

  • 这引出了“您要加入的表”是什么意思的问题。
【解决方案4】:

是的,它由表格出现在 JOIN 运算符的一侧确定。你的两个例子确实是等价的。

【讨论】:

  • 您的回答似乎自相矛盾。你说相对于操作员的位置决定了哪个表是左和右,但在我的例子中它们是交换的,你说它们是等价的。
  • 请仔细阅读:我说的是相对于 JOIN 运算符的位置,而不是相等运算符。
【解决方案5】:

有关联接的很好的演练,请参阅此内容:http://en.wikipedia.org/wiki/Join_(SQL)

是的,这两个语句是等价的:-)

【讨论】:

  • @djacobson:谢谢,已更正。没有什么比这更容易搞砸了!
  • 这是我在过去的 BBS 时代使用的标语……啊,14.4k 的 USR 奢华回忆 :)
  • 让人联想到:世界上的诵读困难...解开! :)
猜你喜欢
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2016-07-26
  • 2016-04-02
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多