2013-07-08 25 views
-2

我有兩張表;一個表格包含我所有的訂單(ORDERS),另一個表格是城市(CITY)的列表。如何根據截斷的主鍵值進行查詢?

任何給定訂單的OrderID的前6位都是根據訂單所來自的城市生成的。

CITY表的左列只是一個六位數的代碼,右邊是城市的名稱。

我想要做的是創建一個查詢,通過比較OrderID的前6位數字和CITY表格,我可以得到城市名稱。

例子:

ORDER

OrderID    Customer Name    Date 
11111135465   David Summerhill   09/28/2011 
44444435463   Margaret Jefferson   06/17/2013 
55555548635   Matthew Cunningham   07/07/2012 
22222265437   David Summerhill   07/08/2013 

CITY

ID   City Name 
111111  New York 
222222  Detroit 
333333  San Jose 
444444  Houston 
555555  Seattle 
666666  Phoenix 

結果:

Customer Name    Date     City 
David Summerhill   09/28/2011    New York 
Margaret Jefferson   06/17/2013    Houston 
Matthew Cunningham   07/07/2012    Seattle 
David Summerhill   07/08/2013    New York 

雖然我使用的MS Access,我想知道怎麼做這與標準的SQL,優選。

+1

你可以改變模式 - 做最好的事情是將訂單拆分成兩個字段一個爲城市那麼它是一個簡單的城市 – Mark

+0

加入這就是我最後做一個快速解決,但將不會允許我即時解決問題。相反,我需要定期更新。我無法訪問程序如何編碼ID。 – toolshed

+0

這不是一個快速的解決方案,但長期的 - 嵌入意義的編碼領域只是一個糟糕的設計 - 涉及領域分裂的修復是短期的攻擊 – Mark

回答

2

您可以在JOIN使用LEFT()如果紐約市ID是一個字符串:

SELECT [Customer Name], Date, [City Name] 
FROM ORDER 
JOIN CITY 
ON LEFT(OrderID,6) = City.ID 

如果城市代碼是一個整數使用其他措施之一。

+0

爲什麼我應該使用其他人使用BIGINT?這似乎工作。 – toolshed

0
SELECT Customer_Name, Date, City 
FROM Order 
JOIN City 
ON City.ID = OrderID DIV 100000 
1

我要麼選擇使用一個計算列的狀態來做一個實際的外鍵引用,要麼我會使用一個sargable謂詞。當在謂詞的列上使用函數時,它可以限制索引查找。

像這樣的東西應該適合你。

SELECT 
    O.CustomerName, 
    [Date]= CONVERT(VARCHAR(12),O.Date,101), 
    c.CityName 
FROM Orders o 
INNER JOIN Cities c 
    ON o.OrderID LIKE CAST(c.ID AS CHAR(6)) + '%' 
相關問題