2012-03-18 132 views
0

我正在使用AdvetureWorks數據庫。這裏是我想要做的: 給我的姓氏,名字,公司名稱,並列出客戶弗吉尼亞米勒的所有地址,包括地址類型,地址,城市和州。 您需要將3個表連在一起並過濾結果。你應該只得到2行。 這是我迄今爲止...加入3個表格並過濾SQL

Select 
SalesLT.Customer.LastName, 
SalesLT.Customer.FirstName, 
SalesLT.Customer.CompanyName, 
CustomerAddress.AddressType, 
SalesLT.Address.AddressLine1, 
SalesLT.Address.City, 
SalesLT.Address.StateProvince 

From SalesLT.Customer C, SalesLT.CustomerAddress CA, SalesLT.Address A 


join SalesLT.CustomerAddress 

on SalesLT.Address.AddressID=SalesLT.CustomerAddress.AddressID 


join SalesLT.Customer 
on SalesLT.CustomerAddress.CustomerID=SalesLT.Customer.CustomerID 

join SalesLT.Address 
on SalesLT.CustomerAddress.AddressID=SalesLT.Address.AddressID 

Where SalesLT.Customer.FirstName = 'Virginia' 

是啊,我新認識不加入很好。任何正確方向的微調都非常感謝!

+0

你的「發件人」行應該只有一個表中列出。「連接」行是告訴SQL你想從中獲取信息的附加表。 那到底是什麼問題?你解釋了你想要的,但不是你嘗試了什麼,或者你有什麼錯誤或問題。 – 2012-03-18 03:15:14

+0

對不起,我得到了太多的行,我只能從查詢中得到2個結果。我有這個可怕的時間,並試圖讓理智。 – 2012-03-18 03:21:17

+0

查詢看起來是正確的,列出的行如選擇下的所有行。我希望那是從它的方式?爲了顯示我在查詢中需要什麼?這是連接表的作用嗎?對不起,我很困惑,但是非常感謝你幫助我。 – 2012-03-18 03:24:17

回答

1

select語句的要點是以特定的方式返回一些數據。這需要大致有以下幾種形式:

select <columns> 
from <table/group of tables joined together/sub-query/tvf etc.> 
where <condition> 

1 - 現在,你已經與有問題的位似乎是中間位 - 我們將做第一個。

你必須包含你想回來的數據三個表:

SalesLT.Customer 
SalesLT.CustomerAddress 
SalesLT.Address 

而且你想將它們連接在一起的,其中數據之間的相互關係,在這種情況下,客戶ID列。內部聯接語句的形式如下(選擇內部連接,因爲所有條目具有其他表的一場比賽!):

table1 inner join table2 on table1.columnname = table2.columnname 

,如果我們你的例子匹配這種語法,我們得到這樣的:

SalesLT.CustomerAddress INNER JOIN 
         SalesLT.Customer ON SalesLT.CustomerAddress.CustomerID = SalesLT.Customer.CustomerID INNER JOIN 
         SalesLT.Address ON SalesLT.CustomerAddress.AddressID = SalesLT.Address.AddressID 

現在,select語句的其餘部分將此查詢視爲一個大的數據「集合」,就好像它是一個表一樣 - 只有每個列是由表名預先固定的。如果你在語句的其他地方引用了一個地方,那麼並不總是需要包含完全限定名稱(因爲只要在結果集中不多於一列具有相同名稱)就可以猜出。

2 - 過濾where子句你似乎已經掌握了,但你似乎只是過濾名字,儘管你最初的要求。增加一個很容易:

WHERE  (SalesLT.Customer.FirstName = 'Virginia') AND (SalesLT.Customer.LastName = N'Miller') 

3 - 最後是你想要回來的小事 - 這你已經有了正確的。

結合我們所做的一起,你會得到下面的查詢:

SELECT  SalesLT.Customer.LastName, SalesLT.Customer.FirstName, SalesLT.Customer.CompanyName, SalesLT.CustomerAddress.AddressType, 
         SalesLT.Address.AddressLine1, SalesLT.Address.City, SalesLT.Address.StateProvince 
FROM   SalesLT.CustomerAddress INNER JOIN 
         SalesLT.Customer ON SalesLT.CustomerAddress.CustomerID = SalesLT.Customer.CustomerID INNER JOIN 
         SalesLT.Address ON SalesLT.CustomerAddress.AddressID = SalesLT.Address.AddressID 
WHERE  (SalesLT.Customer.FirstName = 'Virginia') AND (SalesLT.Customer.LastName = N'Miller') 
+0

謝謝!!!!!!這顯示了兩行要求! – 2012-03-18 03:52:07

+0

對不起,我一直打字輸入之前發送的密鑰!現在我會回顧一下,真正看到我錯過了什麼。擁抱你和每個人的真棒幫助! – 2012-03-18 03:53:10

+0

我認爲解釋和答案可能會幫助你更好地理解它! – Bridge 2012-03-18 03:56:05

0

我沒有安裝Adventure DB,所以我不知道這些關係。假設你提到的關係是有效的,這應該工作:

USE SalesLT 

SELECT 
c.LastName, 
c.FirstName, 
c.CompanyName, 
ca.AddressType, 
a.AddressLine1, 
a.City, 
a.StateProvince, 
FROM Customer C 
INNER JOIN CustomerAddress ca ON ca.CustomerID = c.CustomerID 
LEFT JOIN Address a ON a.AddressID = ca.AddressID 
WHERE c.FirstName = 'Virginia' 

註釋 - 我使用LEFT JOIN的地址,因爲我不知道是否有可能是一個客戶記錄,沒有地址記錄。在可能的情況下,即使沒有地址,您仍然希望爲客戶添加記錄,請使用LEFT JOIN和COALESCE標識NULL記錄。

+0

哦,我的!謝謝,我會試試這個。我很新,這很混亂,但我正在練習! – 2012-03-18 03:30:57

+0

不幸的是,這回來了許多紅線和一個錯誤。我不知道聯盟是什麼。 – 2012-03-18 03:34:40

+0

COALESCE是一個高度使用聲明。它只是取第一個非NULL值,因此COALESCE(a.AddressLine1,a.AddressLine2,c.SomeOtherField,'所有這些字段爲NULL')將取第一個非空值或輸出所有這些字段爲NULL。如果你願意,你可以把COALESCE帶走,我通常會把它們放在那裏用於左連接,這樣我就可以指定在NULL字段值時返回的內容。 – 2012-03-18 03:42:14

1

我認爲以下幾點應該解決您的問題。

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可以找到該數據以及我們在這些表之間定義的關係。

一步步解決問題通常是一個好方法。

+0

謝謝,我會盡力回覆。這是一個很棒的網站。 – 2012-03-18 03:37:19

+0

一切都在它下面有一條紅線,我得到這個錯誤... – 2012-03-18 03:39:12

+0

消息208,級別16,狀態1,行1 無效的對象名稱'客戶'。 – 2012-03-18 03:39:21