2011-10-28 46 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