2011-10-28 50 views
1

我有這樣建議創建做多表的聯合時,一個唯一的ID

CREATE VIEW PEOPLE 

AS 

SELECT CustomerId, CustomerName FROM Customers 
UNION ALL 
SELECT EmployeeId, EmployeeName FROM Employees 
UNION ALL 
SELECT FriendId, FriendName From Friends 

現在我需要添加唯一ID的觀點,自然是因爲我可以有一個CustomerId = 15,並提出了看法一個EmployeeID = 15

所以我做的訣竅是以下

SELECT 
    CAST('1' + CAST(CustomerId AS VARCHAR(30)) AS INT) as UniqueCustomerId, 
CustomerId, CustomerName FROM Customers 
UNION ALL 
SELECT 
    CAST('2' + CAST(EmployeeId AS VARCHAR(30)) AS INT) as UniqueEmployeeId, 
EmployeeId, EmployeeName FROM Employees 
UNION ALL 
SELECT 
    CAST('3' + CAST(FriendId AS VARCHAR(30)) AS INT) as UniqueFriendId, 
FriendId, FriendName From Friends 

反正這個鑄件varchar(30)和回int是一個開銷,因爲我有很多記錄。

你能提出一個更好的方法嗎?

+1

是否需要是一個單列唯一標識符?看起來,將人員類型保存在單獨的專欄中會更清晰。 –

回答

2

如果你得有一個ID,只是做數學:

SELECT 1000000 + CustomerID AS UniqueCustomerId 
     , CustomerId 
     , CustomerName 
FROM Customers 
UNION ALL 
SELECT 2000000 + EmployeeId AS UniqueEmployeeId 
     , EmployeeId 
     , EmployeeName 
FROM Employees 
UNION ALL 
SELECT 3000000 + FriendId AS UniqueFriendId 
     , FriendId 
     , FriendName 
FROM Friends 
+0

在問這個問題後,我在睡眠期間給出相同的答案! – LaBracca

0

這應該很好地工作:

CREATE VIEW PEOPLE AS 
SELECT CustomerId, null as EmployeeId, null as FriendId, CustomerName FROM Customers 
UNION ALL 
SELECT null, EmployeeId, null, EmployeeName FROM Employees 
UNION ALL 
SELECT null, null, FriendId, FriendName From Friends 
1

我喜歡這種方法,因爲它仍然可以使用索引上在客戶,僱員和FriendID

SELECT 1 [PersonType],CustomerId [PersonId], CustomerName [PersonName] FROM Customers 
UNION ALL 
SELECT 2, EmployeeId, EmployeeName FROM Employees 
UNION ALL 
SELECT 3, FriendId, FriendName From Friends 
+0

是的,但我也需要一個獨特的iD – LaBracca