2012-04-30 4 views
9

Это мое мнение:Добавить столбец идентификации в целях в SQL Server 2008

Create View [MyView] as 
(
Select col1, col2, col3 From Table1 
UnionAll 
Select col1, col2, col3 From Table2 
) 

Мне нужно добавить новый столбец с именем Id и мне нужно эту колонку быть уникальным, так что я думаю, чтобы добавить новый столбец в идентичность. Я должен упомянуть, что это представление вернуло большие данные, поэтому мне нужен способ с хорошей производительностью. Кроме того, я использую два запроса select с объединением, все, что я думаю, что это может быть сложно, так что вы предлагаете?

+0

представления в SQL Server просто «хранится запрос» - это не имеет никакого физического представления в базе данных. Таким образом, вы не можете добавить столбец идентификатора в представление –

+0

Хорошо, что 'id' не будет стабильным (если' Table1' растет, первый 'id'' Table2' будет отличаться от предыдущего) – Oded

+1

@ marc_s - Возможно, что OP является jus t ищет функциональность типа ROW_NUMBER. – Oded

ответ

21

Используйте функцию ROW_NUMBER() в SQL Server 2008.

Create View [MyView] as 

SELECT ROW_NUMBER() OVER(ORDER BY col1) AS id, col1, col2, col3 
FROM(
    Select col1, col2, col3 From Table1 
    Union All 
    Select col1, col2, col3 From Table2) AS MyResults 
GO 
+1

Да, но это не обеспечит стабильный идентификатор. – Oded

+1

Если вы отправляете код, образцы XML или данных, ** PLEASE ** выделите эти строки в текстовом редакторе и нажмите кнопку «образцы кода» ('{}') на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис! –

+0

Благодарим вас за это. Это действительно полезно для тестирования данных в представлении перед выполнением таблицы. В моем случае более удобно использовать подобный шаблон: SELECT ROW_NUMBER() OVER (ORDER BY col1) как ID, x. * FROM (SELECT blah blah blah) как x – user1003916

1

Вид просто хранится запрос, который не содержит самих данных, так что вы можете добавить стабильный ID. Если вам нужен идентификатор для других целей, как пейджинг, например, вы можете сделать что-то вроде этого:

create view MyView as 
(
    select row_number() over (order by col1) as ID, col1 from (
     Select col1 From Table1 
     Union All 
     Select col1 From Table2 
    ) a 
) 
+0

Да, но это не даст стабильный идентификатор. – Oded

+0

правда, но он не сказал, что ему нужен.Я предполагаю, что ему нужен идентификатор для некоторых других целей, таких как пейджинг, например, – Diego

+1

Мне не нравится предполагать. Если вы предполагаете, вы должны опубликовать эти предположения ... – Oded

1

Там нет никакой гарантии, что строки, возвращаемые запросом, используя ROW_NUMBER() будут упорядочены точно так же с каждым если не выполняются следующие условия:

  1. Значения разделенного столбца уникальны. [разделы - родительский ребенок, например, у босса есть 3 сотрудника] [игнорировать]
  2. Значения столбцов ORDER BY уникальны. [если столбец 1 уникален, row_number должен быть стабильным)
  3. Сочетания значений столбца раздела и столбцов ORDER BY уникальны. [если вам нужно 10 столбцов в вашем заказе, чтобы получить уникальный ... для этого нужно сделать row_number stable] »

Существует второстепенный вопрос здесь, при этом это выглядит. работа в представлениях (долгое время SQL ошибок) Игнорирование row_number() для второго:

create view MyView as 
(
    select top 10000000 [or top 99.9999999 Percent] col1 
    from (
     Select col1 From Table1 
     Union All 
     Select col1 From Table2 
    ) a order by col1 
) 
Смежные вопросы