Предложения по созданию уникального идентификатора при объединении нескольких таблиц - PullRequest
1 голос
/ 28 октября 2011

У меня есть вид, подобный этому

CREATE VIEW PEOPLE

AS

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

Теперь мне нужно добавить уникальный идентификатор для вида, потому что, конечно, я могу иметь CustomerId = 15 и EmployeeID = 15

* 1007.* Итак, уловка, которую я делаю, заключается в следующем
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 является непроизводительным расходом, поскольку у меня много записей.лучший подход?

Ответы [ 3 ]

3 голосов
/ 28 октября 2011

Если вам нужен один идентификатор, просто сделайте математику:

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 
1 голос
/ 28 октября 2011

Я предпочитаю этот подход, поскольку он все еще может использовать индексы для CustomerID, EmployeeID и 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 голосов
/ 28 октября 2011

Это должно работать нормально:

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...