我是一名学生正在尝试学习Microsoft SQL,我很沮丧,因为我无法理解自然联接是如何工作的。我有一个解决方案的问题,但我无法理解这个解决方案是如何通过自然连接创建的。我的朋友发送了他原来的解决方案,但不记得他是如何得到结果的。我真的想弄清楚这种自然连接是如何工作的。有人可以解释一下这个答案是如何实现的吗?
问题来自"数据库设计,应用和管理第6版:
编辑:本书在我到目前为止阅读的章节中没有提供关于如何获得自然连接结果的查询语句。这让我感到更加困惑,因为我不能简单地添加表格并发送查询。
Edit2:订单表中某些条目具有空值的原因是因为该问题暗示某些订单是通过互联网处理的。我的一个朋友告诉我,这就是为什么他的问题正确反对一些反对它的人。 :S
答案 0 :(得分:1)
如果我正确地阅读了您的问题,您正在尝试同时学习两个概念。第一个是INNER JOIN(有时称为equijoin)。第二是自然联合。
假设您已经知道INNER JOIN如何工作,那么解释自然连接会更容易。自然连接只是一个等值连接,其中列名称指示连接条件应该是什么。在您的情况下,CustNo出现在两个表中的事实是您设计正确连接条件所需的唯一线索。您还只在结果中包含一次连接字段。
列名实际上是非常随意的,在这种情况下可能会有很大不同。例如,如果Customer.CustNo列已被命名为Customer.ID,则您将无法进行自然连接。
在您的案例中找到正确的解决方案,请参阅JamieC提供的答案。
答案 1 :(得分:0)
如果你只想在这里得到问题的最终表的查询,那么
SELECT
o.OrdNo,
o.OrdDate,
o.EmpNo,
o.CustNo,
c.CustFirstName
c.CustLastName,
c.CustCity,
c.CustSatate,
c.CustZip,
c.CustBal
FROM OrderTbl o
INNER JOIN Customer c
ON o.CustNo = c.CustNo
ORDER BY c.CustNo
所以,通过解释;此查询选择Customer
和OrderTbl
使用CustNo
加入两者的所有数据,Customer
是OrderTbl
中的主键(可能)和CustNo
中的外键。结果的排序有点棘手,几乎完全基于猜测,我怀疑结果也按Employee
排序。
OrderTbl
表在结果中根本不具备功能,但由于EmpNo
表有LEFT JOIN
的一些空格,您几乎肯定会想要RIGHT JOIN
/如果您想从订单表中检索有关该员工的任何信息,请var customToken = firebase.auth().createCustomToken(uid);
(视情况而定)。
答案 2 :(得分:0)
MS SQL Server不支持NATURAL JOIN。但是,如果您使用的是支持它的平台,那么就简单了:
SELECT * FROM Customer NATURAL JOIN OrderTbl;
应该这样做。