2016-09-28 54 views
1

我有一個任務,我必須創建兩個表,名爲客戶地址。這些表位於名爲HandsOnOne的數據庫中。SQL幫助從兩個表中選擇客戶信息

客戶已列標題是: CustomerIDCustomerNameCustomerAddressID

地址已列標題是: AddressIDStreetCityStateZipCode

有其中一個外鍵關係AddressID地址表是初級ry鍵和CustomerAddressID客戶表是外鍵。

我用下面的代碼將值插入每個表:

USE HandsOnOne; 

INSERT INTO Address (AddressID, Street, City, State, ZipCode)  
VALUES (1, '2400 Broadway Drive', 'Missoula', 'MT', '59802'), 
(2, '320 21st Street', 'Billings', 'MT', '59101'),  
(3, '439 Skyline Blvd', 'Denver', 'CO', '80002'),  
(4, '56 Park Avenue', 'New York', 'NY', '10001'); 

USE HandsOnOne; 

INSERT INTO Customer (CustomerID, CustomerName, CustomerAddressID) 
VALUES (1, 'Western Supply Company', 1),  
(2, 'Nick Harper', 3), 
(3, 'Alice Harper', 3), 
(4, 'Abacus Consulting', 4); 

從那裏,我必須根據一定的規範進行排序。第一個規範是列出城市和州的所有客戶,按照ZipCode升序排列,然後由CustomerName升序排列。

下面是我用這部分代碼:

USE HandsOnOne; 

SELECT CustomerName, City, State  
FROM Customer, Address 
ORDER BY ZipCode ASC, CustomerName ASC; 

當我執行這個代碼,我的回報是16個項目,而不是4,不知何故,每個客戶被分配每個地址,給我4個項目在每個地址。

下一個問題問我列出StreetCityState,並且全部地址的ZipCode沒有一個與之關聯的客戶。
此查詢應該返回320 21聖比林斯的地址,MT 59101因爲它AddressID值並沒有在地址表中沒有CustomerAddressID價值。但是,我執行此查詢時沒有收到任何結果。

我已驗證存在外鍵關係。我究竟做錯了什麼?

+1

由於JohnHC已經給出了答案,我會補充一點:下圖對我幫助很大,當我開始使用連接:) http://3.bp.blogspot.com/-bC- tThYQxxU/UZy6wVYiZeI/AAAAAAAAAjM/A18S8PkK6Uo/s1600/SQL + JOINS.PNG – DenStudent

+1

@DenStudent我在牆上有類似的東西 – JohnHC

+1

[踢壞的習慣:使用舊式JOIN](http://sqlblog.com/blogs/ aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - 舊式*逗號分隔的表*樣式列表被替換爲* proper * ANSI在ANSI - ** 92 ** SQL標準中使用'JOIN'語法(**超過20年**之前),並且不鼓勵使用它 –

回答

5

您不限制您的加入。此外,大多數DBMS(尤其是最新版本的SQL Server)都不再支持隱式連接,因此最好使用明確的Inner Join

試試這個:

select CustomerName, City, State 
from Customer 
inner join Address 
    on AddressID = CustomerAddressID -- I assume this is the foreign key 
order by ZipCode asc, CustomerName asc 

啊,問題2(錯過了由於格式)

select A1.* 
from Address A1 
left join Customer C2 
    on A1.AddressID = C2.CustomerAddressID 
where C2.CustomerAddressID is null 
+0

工作,謝謝!這個連接需要明確說明。 –

0

對於您的第二個問題:使用NOT EXISTS來獲取所有的地址沒有一個顧客。請看下圖:

SELECT * 
FROM Address A 
WHERE NOT EXISTS (SELECT 1 
        FROM Customer C 
        WHERE C.CustomerAddressID = A.AddressID) 
+1

我有一種感覺,那就是要學習關於連接的任務......但這對於第二個問題絕對是正確的解決方案,可能不是您需要的答案。 – JohnHC

+0

在第二個問題中,我發現解決方案必須使用連接。 –

+0

是的,但看看上下文。 Q1是關於內部連接的,Q2可以通過連接來解決。嘿,我不是說你錯了。你的是最有效的解決方案。我只是說使用聯合更有可能成爲分配的答案(自己寫了幾個這樣的答案)。 – JohnHC