2012-04-30 7 views
9

To jest mój widok:Dodaj kolumny tożsamości do widoku SQL Server 2008

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

muszę dodać nową kolumnę o nazwie Id i muszę tej kolumnie być unikalne, więc myślę, aby dodać nową kolumnę jako tożsamość. Muszę wspomnieć, że ten widok zwrócił dużą ilość danych, więc potrzebuję sposobu z dobrą wydajnością, A także używam dwóch wybranych zapytań ze związkiem wszystko, co myślę, że to może być trochę skomplikowane, więc jaka jest Twoja sugestia?

+0

Widok w SQL Server to po prostu "przechowywane zapytanie" - nie ma fizycznej reprezentacji w bazie danych Dlatego nie można dodać kolumny tożsamości do widoku –

+0

Czy to w porządku, że 'id' nie będzie stabilny (jeśli" Tabela1 "rośnie, pierwszy" identyfikator "z' Tabela2' będzie inny niż wcześniej)? – Oded

+1

@ marc_s - Jest możliwe, że OP jest sus t szukanie tutaj funkcji typu "ROW_NUMBER". – Oded

Odpowiedz

21

Użyj funkcji ROW_NUMBER() w 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

Tak, ale to nie zapewni stabilnego identyfikatora. – Oded

+1

Jeśli dodasz kod, XML lub próbki danych, ** PLEASE ** podświetl te linie w edytorze tekstu i kliknij przycisk "próbki kodu" ('{}') na pasku narzędzi edytora, aby ładnie sformatować i podświetlić składnię! –

+0

Dziękuję za to. Jest to bardzo przydatne do testowania danych w widoku przed zatwierdzeniem tabeli. W moim przypadku bardziej wygodnie jest użyć symbolu wieloznacznego: SELECT ROW_NUMBER() OVER (ORDER BY col1) jako ID, x. * FROM (SELECT bla bla bla) jako x – user1003916

1

Widok jest po prostu przechowywane kwerendy, która nie zawiera samych danych, dzięki czemu można dodać stabilnej tożsamości. Jeśli potrzebujesz id do innych celów jak stronicowania na przykład, można zrobić coś takiego:

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

Tak, ale to nie zapewni stabilny identyfikator. – Oded

+0

prawda, ale nie powiedział, że go potrzebuje.Zakładam, że potrzebuje identyfikatora do innych celów, takich jak stronicowanie, na przykład – Diego

+1

Nie podoba mi się zakładanie. Jeśli założysz, powinieneś opublikować te założenia ... – Oded

1

nie ma gwarancji, że wiersze zwracane przez kwerendy przy użyciu ROW_NUMBER() zostaną uporządkowane dokładnie to samo z siebie wykonanie, chyba że spełnione są następujące warunki:

  1. Wartości kolumny podzielonej na partycje są unikalne. [partycje są rodzic-dziecko, tak jak szef ma 3 pracowników] [ignoruj]
  2. Wartości kolumn ORDER BY są unikalne. [jeśli kolumna 1 jest unikatowa, numer wiersza powinien być stały]
  3. Kombinacje wartości kolumny podziału i kolumny ORDER BY są unikalne. [Jeśli potrzebujesz 10 kolumn w zamówieniu, aby uzyskać niepowtarzalny ... idź na to, aby ROW_NUMBER stabilny]”

Jest kwestią drugorzędną tutaj, z tym, że jest widok. Order By nie robić zawsze praca w widokach (długi błąd sql) Ignorowanie numeru wiersza() przez sekundę:

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 
) 
Powiązane problemy