我认为以下几点应该解决您的问题。
USE SalesLT
SELECT
c.LastName,
c.FirstName,
c.CompanyName,
ca.AddressType,
a.AddressLine1,
a.City,
a.StateProvince
FROM
Customer c
JOIN
CustomerAddress ca
ON c.CustomerID=ca.CustomerID
JOIN
Address a
ON ca.AddressID=a.AddressID
WHERE
c.FirstName = 'Virginia'
AND c.LastName = 'Miller'
当构建一个SQL查询时,我发现最好从我的主表中选择我想要的数据开始。所以在这个查询的情况下,你正在寻找关于某个特定客户的信息(在这个例子中你已经给出了它的弗吉尼亚米勒)。所以只要获得关于该客户的信息,查询就会像这样。
USE SalesLT
SELECT
c.LastName,
c.FirstName
FROM
Customer c
WHERE
c.FirstName = 'Virginia'
AND c.LastName = 'Miller'
所以,你做了什么有开始以表示你将要使用的数据库(这是USE SalesLT线)。这将有助于打字,因此您无需在每个表名称前添加它。
接下来,您正在选择您感兴趣的列名(姓氏和名字)。他们有“c”。在他们面前指定表格的昵称或“别名”,我们说SQL可以找到该数据。
在“FROM”行中,您可以看到您告诉SQL查看客户表,并且您将为该表提供“c”的别名,以便您可以快速引用它并清楚哪些列属于查询中的哪些表。
既然你已经拿到了弗吉尼亚米勒的数据,让我们看看下一篇文章。您需要弗吉尼亚州的地址,以便您需要某种方式将地址数据与客户数据相关联。
幸运的是,AdventureWorks数据库很容易做到,因为它们具有CustomerAddress“join”表。这样的表格旨在简化具有某些类型的ID列的两个表之间的链接记录。在这种情况下,它将CustomerID(Customer表中的一列)和AddressID(Address表中的一列)链接起来,以便我们可以计算出特定客户可能拥有的地址。
因此,现在我们知道我们将需要CustomerAddress中的数据,因此我们应该将下一部分添加到我们的查询中。
USE SalesLT
SELECT
c.LastName,
c.FirstName,
c.CompanyName,
ca.AddressType
FROM
Customer c
JOIN
CustomerAddress ca
ON c.CustomerID=ca.CustomerID
WHERE
c.FirstName = 'Virginia'
AND c.LastName = 'Miller'
在上面的代码中的新作品是除了从CustomerAddress表中选择地址类型,然后告诉SQL如何Customer表和CustomerAddress表中相关的。它可以在它们之间加入记录,因为Customer表中的CustomerID等于CustomerAddress表中的客户ID(JOIN CustomerAddress ca ON c.CustomerID = ca.CustomerID)。 “ca”是我们给予CustomerAddress表的别名或别名,所以我们使用它来在查询中的任何其他地方引用它。
现在我们已经有了这部分查询的工作,我们已准备好在最后阶段获取实际的地址信息。
USE SalesLT
SELECT
c.LastName,
c.FirstName,
c.CompanyName,
ca.AddressType
FROM
Customer c
JOIN
CustomerAddress ca
ON c.CustomerID = ca.CustomerID
JOIN
Address a
ON a.AddressID = ca.AddressID
WHERE
c.FirstName = 'Virginia'
AND c.LastName = 'Miller'
最后一步只是添加了Address表与CustomerAddress表相关的附加信息。基本上CustomerAddress中的AddressID列等于Address中的AddressID列。
现在我们回到原始查询并提供我们想要的所有信息,表SQL可以找到该数据以及我们在这些表之间定义的关系。
一步步解决问题通常是一个好方法。
你的“发件人”行应该只有一个表中列出。“连接”行是告诉SQL你想从中获取信息的附加表。 那到底是什么问题?你解释了你想要的,但不是你尝试了什么,或者你有什么错误或问题。 – 2012-03-18 03:15:14
对不起,我得到了太多的行,我只能从查询中得到2个结果。我有这个可怕的时间,并试图让理智。 – 2012-03-18 03:21:17
查询看起来是正确的,列出的行如选择下的所有行。我希望那是从它的方式?为了显示我在查询中需要什么?这是连接表的作用吗?对不起,我很困惑,但是非常感谢你帮助我。 – 2012-03-18 03:24:17