2014-01-13 14 views
1

我有兩個表:如何在內部不同的重複行(按字段)聯接子句

Customers -> CustomerId, Name 

Phones -> PhoneId , CustomerId , Phone 

該表通過加入客戶id字段。每個客戶在手機表中都有多個手機 。我只需要獲得其中一個。我怎樣才能做到這一點。

SELECT 
     Customers.CustomerId , 
     Customers.Name , 
     Phones.Phone 
FROM Customers 
    INNER JOIN Phones ON Customers.CustomerId = Phones.CustomerId 

在這種情況下,我得到的東西,如:

+----------+----+-----------+ 
|CustomerId|Name|Phone  | 
+----------+----+-----------+ 
|1010  |Jack|999-999-999| 
+----------+----+-----------+ 
|1010  |Jack|888-888-888| 
+----------+----+-----------+ 
|1010  |Jack|111-111-111| 
+----------+----+-----------+ 
|2020  |Pit |123-123-123| 
+----------+----+-----------+ 
|2020  |Pit |321-321-321| 
+----------+----+-----------+ 

但我只需要一個客戶,一個電話號碼,如:

+----------+----+-----------+ 
|CustomerId|Name|Phone  | 
+----------+----+-----------+ 
|1010  |Jack|888-888-888| 
+----------+----+-----------+ 
|2020  |Pit |123-123-123| 
+----------+----+-----------+ 

我試着使用子查詢做到這一點:

SELECT 
    c.CustomerId , 
    c.Name , 
    SELECT (p.Phone FROM Phones WHERE p.CustomeId=c.CustomerId FETCH FIRST 1 ROWS ONLY) 
    FROM Customers c 

但它窩rks VERYYYY SLLOOOW這就是爲什麼我不能使用子查詢。我怎麼能做到呢?

+0

我們希望你有電話號碼的一些額外的細節(國家代碼是好的)。請注意,您不應該存儲格式化的數字(這是一個顯示級別的函數,並且無論如何都是上下文相關的),並且可能需要單獨的「輸入助記符表單」列(對於類似於「CUT-TREE」的內容)我不確定所有國家是否都使用相同的編碼。 –

+0

所以當你有多個電話號碼時,你有什麼方法可以決定哪一個最適合選擇?任意的選擇可能不是一個好的解決方案。 – WarrenT

回答

0

最好的選擇是使用數據透視。欲瞭解更多信息,請訪問http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/。也通過使用這個,你也可以查看你的所有電話號碼......

+0

DB2有可能嗎? – Graffiti908

+0

只是在這裏簽出http://stackoverflow.com/questions/13579143/how-can-i-pivot-a-table-in-db2 :) –

+1

正如Biby所指出的那樣,DB2不支持這個答案。即使是這樣,爲什麼你想在這種情況下?你只需要一個數字,而不是多個列來保存幾個數字。 – WarrenT

1

Row_Number()功能將幫助你。

WITH X AS 
(SELECT C.CustomerId 
     , C.Name 
     , P.Phone 
     , ROW_NUMBER() OVER (PARTITION BY P.CustomerID) AS Pick 
    FROM Customers C 
    JOIN Phones P ON C.CustomerId = P.CustomerId 
) 
SELECT CustomerID 
    , Name 
    , Phone 
    FROM X 
    WHERE Pick = 1 

這將爲與給定客戶有關的每個電話號碼分配一個基數,並且只選擇第一個。現在在這種情況下,我們隨意挑選哪一個電話號碼是第一個。

假設您的手機表中有其他字段可能會幫助您決定哪個是最好的選擇。比方說,你有一個Last_Used時間戳,最好的數字可以是最近使用的數字。然後你可以使用這樣的表達式:

ROW_NUMBER() OVER (PARTITION BY P.CustomerID ORDER BY P.Last_Used desc) 

當然,如果你在談論一些其他類型的字段,它有可能會是有意義的只是使用MIN()或MAX()和GROUP BY客戶id 。但我看不出有任何理由用電話號碼這樣做。

0

這將返回每個客戶ID

SELECT 
    c.CustomerId, 
    c.Name, 
    Min(p.Phone) Phone -- Or Max(p.Phone) 
FROM Customers c 
    LET OUTER JOIN Phones p on c.CustomeId = p.CustomeId 
GROUP BY c.CustomerId, c.Name 
0

一個電話號碼試試這個

Note: This is not tested code

SELECT 
     distinct Phones.Phone, 
     Customers.CustomerId , 
     Customers.Name 

FROM Customers 
    INNER JOIN Phones ON Customers.CustomerId = Phones.CustomerId 
+0

不,不會去工作(你真的應該測試它)。在這種情況下,「DISTINCT」將不會執行任何操作:每個客戶的電話號碼都是唯一的。 –

相關問題