【问题标题】:Quick SQL Server Joins Review快速 SQL Server 加入审查
【发布时间】:2015-03-31 12:07:09
【问题描述】:

我一直在研究联接,我只是希望有人确认我对它的理解。

当涉及到连接时,它总是 ParentTable 右外连接 ChildTable 这也是正确的:ChildTable left outer join ParentTable.

这有什么问题:ParentTable 左外连接 ChildTable 这将给出 空值?

我在下面做了一个快速选择,对吗?

Select Mom, Brother from ParentTable right outer join ChildTable
on ParentTable.LastName = ChildTable.LastName

或者是左外连接还是内连接? 下周二我有一个即将进行的测试,这让我很困惑,任何帮助都会很棒!

【问题讨论】:

  • RIGHTLEFT 指的是“主”表,如果你愿意的话。您从中获取所有记录的表,匹配的和不匹配的。那么,您想从哪个表中获取所有记录?
  • 所以如果正确,方向总是指向父表,那么我给出的示例是错误的?
  • 所以它看起来像这样?从 ParentTable 中选择 Mom, Brother 左外连接 ChildTable on ParentTable.LastName = ChildTable.LastName
  • 这两个查询是不同的。首先,由于左连接 (ParentTable left outer join...),您将从 ParentTable 中获取所有行。在第二个中,您将从ChildTable (right outer join ChildTable) 中获取所有行。自己运行查询,我敢打赌,你会看到不同之处。这是一个很棒的visualization,可以帮助您理解这一点。
  • 这不是一个真正的数据库,它只是我想出的一个例子,但我确实有一个数据库,我在一个月前完成了工作,它有 3 个连接.我对所有这些都使用了右外连接,它给了我 50 条记录中的 2 条记录,这是正确的答案。出于好奇,我将一个右外连接替换为左外连接,它仍然给我相同的结果。

标签: sql-server


【解决方案1】:

当您查看此内容时,父母和孩子并不是最好的例子,它们让您想到特定的家庭“关系”,这限制了您的思考方式。

让我们看两个更简单的表格:

甲:乙: a.id a.val b.id b.val 1 a1 1 b1 2 a2 3 b3 4 a4 5 b5 6 a6 6 b6 7 a7

这是一个简单的左外连接:

SELECT a.*, b.* FROM a LEFT OUTER JOIN b ON a.id = b.id;

这里的“a”是左表,所以表“a”中的所有行都将被包括在内,但只有表“b”中匹配的行,否则从该表中选择的所有字段都将为“空”。

结果: a.id a.val b.id b.val 1 a1 1 b1 2 a2 null null 4 a4 null null 6 a6 6 b6 7 a7 null null

这是一个简单的右外连接:

SELECT a.*, b.* FROM a RIGHT OUTER JOIN b ON a.id = b.id;

这里的“a”仍然是左表,但是因为我们指定了右连接,所以“b”中的所有行都将被包括在内,但只匹配来自 a 的行。

结果: a.id a.val b.id b.val 1 a1 1 b1 空空 3 b3 空空 5 b5 6 a6 6 b6

LEFT 和 RIGHT 只是引用 JOIN 子句中的表,并且都会根据表中的数据给出空值。


如果您交换表并使用 LEFT 而不是 RIGHT(反之亦然),则相同,因此以下与上面的第一个查询相同:

SELECT a.*, b.* FROM b RIGHT OUTER JOIN a ON a.id = b.id;

请注意,SELECT 或 ON 子句中表的顺序不会影响 join 子句。


INNER JOIN 不需要 LEFT 或 RIGHT 术语,因为它不会显示左侧或右侧的所有记录,而只会显示匹配的记录:

SELECT a.*, b.* FROM a INNER JOIN b ON a.id = b.id;
结果: a.id a.val b.id b.val 1 a1 1 b1 6 a6 6 b6

不要将表视为数据集,而不是将表视为数据集,这可能会让您感到困惑。

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    相关资源
    最近更新 更多