Supongamos que tenemos 3 tablas como sigue:

Tabla1 : Columna1, Columna2, Columna3

Tabla2 : Columna1, Columna2, Columnaxyz, Columna3

Tabla3 : Columna1, Columna2, Columna3

Tengo una vista con el siguiente DDL:

CREATE VIEW [dbo].[View1]
  AS (
    SELECT 'Table1' as [Source], * FROM [Table1] 
    UNION
    SELECT 'Table2' as [Source], * FROM [Table2]
    UNION
    SELECT 'Table3' as [Source], * FROM [Table3]
  );

Esa vista funciona perfectamente asumiendo que todas las tablas tienen las mismas columnas.

Sin embargo, en el ejemplo anterior, con table2 con una columna adicional: columnxyz ¿Qué debería cambiar en la unión de vistas? En otras palabras, ¿tengo que crear Table1 y Table3 con esta columna adicional también, o podemos eludir esto agregando dinámicamente esta columna adicional en la vista a las otras tablas que faltan y llenándola con "Ninguno" o "N? / A "como datos predeterminados (ya que Table1 y table2 no tienen originalmente esta columnaxyz, por lo que realmente no hay datos de todos modos).

0
Cataster 22 ene. 2021 a las 04:38

1 respuesta

La mejor respuesta

Seleccione una constante de las tablas sin la columna adicional, exactamente lo mismo que ya está haciendo para [Source]. Sin embargo, tendrá que enumerar las columnas explícitamente, ya que la columna adicional no es la primera ni la última. Como práctica recomendada, siempre debe enumerar sus columnas de todos modos.

CREATE VIEW [dbo].[View1]
AS (
  SELECT 'Table1' as [Source], Column1, Column2, 'N/A' AS ColumnXYZ, Column3
  FROM [Table1] 
  UNION ALL
  SELECT 'Table2' as [Source], Column1, Column2, ColumnXYZ, Column3
  FROM [Table2]
  UNION ALL
  SELECT 'Table3' as [Source], Column1, Column2, 'N/A' AS ColumnXYZ, Column3
  FROM [Table3]
);

Tenga en cuenta que he usado UNION ALL porque UNION intentará duplicar sus datos, lo que normalmente no desea, y sufre una penalización de rendimiento por hacerlo. Personalmente, siempre me ocupo de una deduplicación / agrupación de otras formas.

2
Dale K 22 ene. 2021 a las 01:58