2012-04-30 12 views
9

Este es mi punto de vista:Añadir columna de identidad a una vista en SQL Server 2008

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

tengo que añadir una nueva columna llamada Id y necesito esta columna será único por lo que creo que añadir nueva columna como identidad. Debo mencionar que esta vista devolvió una gran cantidad de datos, así que necesito una forma con buen rendimiento. Y también utilizo dos consultas de selección con unión, creo que esto podría ser algo complicado, ¿cuál es su sugerencia?

+0

una vista en SQL Server es sólo una "consulta almacenada" - que no tiene ninguna representación física en la base de datos. Por lo tanto, no puede agregar una columna de identidad a una vista –

+0

¿Está bien que el 'id' no sea estable (si' Table1' crece, el primer 'id' de' Table2' será diferente al anterior)? – Oded

+1

@ marc_s - Es posible que el OP sea jus Está buscando la funcionalidad de tipo 'ROW_NUMBER' aquí. – Oded

Respuesta

21

utilizar la función ROW_NUMBER() en 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

Sí, pero esto no proporcionará una identificación estable. – Oded

+1

Si publica código, XML o muestras de datos, ** POR FAVOR ** resalte esas líneas en el editor de texto y haga clic en el botón "muestras de código" ('{}') en la barra de herramientas del editor para formatear y resaltar la sintaxis. –

+0

Gracias por esto. Esto es realmente útil para probar datos en una vista antes de comprometer una tabla. En mi caso, es más conveniente usar un comodín como el siguiente: SELECCIONAR ROW_NUMBER() OVER (ORDER BY col1) como ID, x. * FROM (SELECCIONAR blah blah blah) como x – user1003916

1

La vista es simplemente una consulta almacenada que no contenga los datos en sí lo que puede añadir un identificador estable. Si necesita un ID para otros fines, como la paginación por ejemplo, se puede hacer algo como esto:

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

Sí, pero esto no proporcionará un Identificación estable – Oded

+0

cierto, pero él no dijo que necesita uno.Supongo que necesita la identificación para otros fines, como la búsqueda, por ejemplo – Diego

+1

No me gusta asumir. Si lo asumes, deberías publicar esas suposiciones ... – Oded

1

No hay garantía de que las filas devueltas por una consulta mediante ROW_NUMBER() será ordenada exactamente lo mismo con cada uno ejecución a menos que se cumplan las siguientes condiciones:

  1. Los valores de la columna particionada son únicos. [las particiones son parentales e hijos, como un jefe tiene 3 empleados] [ignorar]
  2. Los valores de las columnas ORDER BY son únicos. [si la columna 1 es única, row_number debe ser estable]
  3. Las combinaciones de valores de la columna de partición y las columnas ORDER BY son únicas. [si necesita 10 columnas en su orden para obtener una única ... vaya para que establezca row_number estable] "

Hay un problema secundario aquí, con esto es una vista. Hacer una orden no siempre el trabajo en vistas (desde hace mucho tiempo de errores SQL) Ignorando el row_number() por un segundo:

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 
) 
Cuestiones relacionadas