此外,如何适应左外加入,右外加入和全外加入?


当前回答

批评了我非常喜欢的红色阴影的Venn图表,我认为发表我自己的尝试是公平的。

虽然 @Martin Smith 的答案在很长一段时间内是这个集合中最好的,但他的单一显示每个桌子的关键列,而我认为理想的非关键列也应该显示。

在允许的半小时内我能做的最好,我仍然不认为它足够地表明,由于TableB中缺乏关键值,零值存在,或者外加入实际上是一个联盟而不是一个联盟:

此分類上一篇

其他回答

内部加入

回收相匹配的行只,也就是说, A 交叉 B。

此分類上一篇

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

左向外加入

从第一张表中选择所有记录,以及与附件密钥相匹配的第二张表中的任何记录。

此分類上一篇

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

全外加入

从第二张表中选择所有记录,以及与附件密钥相匹配的第一张表中的任何记录。

此分類上一篇

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

参考

内部和外部加入 SQL 示例和加入区块 SQL: JOINS

简单的说法:

一个内部合并只接收相匹配的行列。

虽然一个外部加入从一个表中获取相匹配的行,而在另一个表中的所有行......结果取决于你使用哪个行:

左: 右桌上的匹配行和左桌上的所有行 右: 左桌上的匹配行和右桌上的所有行 或 完整: 所有桌上的所有行。

INNER JOIN,LEVT/RIGHT OUTER JOIN的准确算法如下:

從第一個表中取出每個行: a 考慮從第二個表中取出所有行: (a,b[i]) 評估對每個對方的 ON... 條件: ON(a,b[i] = 真實/錯誤? 當條件評估為真實時,返回相結合的行(a,b[i])。

... ON T1.title = T2.title AND T1.version < T2.version ( => see this post as a sample use: Select only rows with max value on a column)... ON T1.y IS NULL... ON 1 = 0 (just as sample)

此分類上一篇


此分類上一篇

注意:左加入 = 左外加入,右加入 = 右外加入。

您使用 INNER JOIN 返回两个表中的所有行,即在结果表中,所有行和列都将有值。

在 OUTER JOIN 中,结果表可能有空列,外部加入可能是左或右。

LEFT OUTER JOIN 从第一张桌子中返回所有行,即使在第二张桌子中没有比赛。

RIGHT OUTER JOIN 从第二张桌子返回所有行,即使在第一张桌子上没有比赛。

INNER JOIN 要求在比较两个表中至少有一场比赛. 例如,表 A 和表 B 意味着 A 8 B (A 交叉点 B)。

LEFT OUTER JOIN 和 LEFT JOIN 是相同的. 它提供所有相匹配的记录在两张桌子和所有选项的左桌子。

同样,RIGHT OUTER JOIN和RIGHT JOIN是相同的,它提供了所有记录相匹配的两张表和所有可能的正确的表。

FULL JOIN 是 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 无重复的组合。