Pregunta

¿Es posible consultas UNION de tablas o vistas que no tienen ninguna consecuencia en común? Lo que estoy tratando de hacer es combinar datos de diferentes puntos de vista en un resultado. Tengo

select a,b,null,c from VIEW1, VIEW2 where VIEW1.a = VIEW2.a
UNION
select null,null,z,null from VIEW3

Me gustaría que el resultado sea a, b, z, c. ¿Es aquí donde me gustaría utilizar Selecciona de? Lo que se ve eso?

select ? from (
select a,b,null,c from VIEW1, VIEW2 where VIEW1.a = VIEW2.a
UNION
select null,null,z,null from VIEW3)

Estoy usando MS SQL Server y las vistas no tienen claves primarias. Muchas gracias.

¿Fue útil?

Solución

Si entiendo su pregunta, es probable que obtener resultados como este:

a1, b1, null, c1
a2, b2, null, c2
a3, b2, null, c3
null, null, z1, null
null, null, z2, null
null, null, z3, nul

l

.. pero lo que está tratando de obtener resultados como este son:

a1, b1, z1, c1
a2, b2, z2, c2
a3, b2, z3, c3

¿Entiendo el problema correctamente?

Si esto es correcto, usted necesita tener una manera de unir estas subconsultas juntos, de manera que se puede decir que el SQL 1 a ir juntos, y el 2 de ir de la mano, y así sucesivamente.

Otros consejos

Un concatena unión conjuntos de resultados, no se combina ellos.

Así que lo que va a obtener de su primera consulta es la siguiente:

  a      b    (null)  c
(null) (null)   z    (null)

Si desea combinarlos, usted tendrá que unirse a ellos, y luego es necesario tener algo en común, o tendrá que combinar los datos en el programa.

¿Sólo tiene 1 de cada fila?

Si es así, entonces, si el patrón anterior siempre va a ser así, esto funcionaría:

SELECT SQ1.a, SQ1.b, SQ2.z, SQ1.c
FROM (
    SELECT 1 k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT 1 k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

Sin embargo, si usted no sabe si View3.a tiene un valor o View1.a tiene un valor, y desea que el uno de la primera consulta si hay un valor de 3, entonces esto funcione:

SELECT COALESCE(SQ1.a, SQ2.a) a, COALESCE(SQ1.b, SQ2.b) b,
    COALESCE(SQ1.z, SQ2.z) z, COALESCE(SQ1.c, SQ2.c) c
FROM (
    SELECT 1 k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT 1 k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

Pero, y hay un gran pero aquí. Si usted tiene más de una fila en cualquiera de los puntos de vista, se le va a terminar con datos que no pertenecen juntos. En ese caso, debe tienen algo en común.

Aquí está el código completo que he intentado, junto con los resultados:

USE master
GO

DROP DATABASE TestDB
GO

CREATE DATABASE TestDB
GO

USE TestDB
GO

CREATE TABLE View1
(
    a INT,
    b INT,
    c INT
)
GO

CREATE TABLE View2
(
    a INT,
    z INT
)
GO

CREATE TABLE View3
(
    z INT
)
GO

INSERT INTO View1 (a, b, c) VALUES (10, 20, 30)
GO

INSERT INTO View2 (a, z) VALUES (10, 40)
GO

INSERT INTO View3 (z) VALUES (50)
GO


SELECT View1.a, b, NULL z, c
FROM View1 INNER JOIN View2 ON View1.a = View2.a
UNION
SELECT NULL a, NULL b, z, NULL c
FROM View3

SELECT SQ1.a, SQ1.b, SQ2.z, SQ1.c
FROM (
    SELECT 1 k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT 1 k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

SELECT COALESCE(SQ1.a, SQ2.a) a, COALESCE(SQ1.b, SQ2.b) b,
    COALESCE(SQ1.z, SQ2.z) z, COALESCE(SQ1.c, SQ2.c) c
FROM (
    SELECT 1 k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT 1 k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

Resultados:

a           b           z           c
----------- ----------- ----------- -----------
NULL        NULL        50          NULL
10          20          NULL        30

(2 row(s) affected)

a           b           z           c
----------- ----------- ----------- -----------
10          20          50          30

(1 row(s) affected)

a           b           z           c
----------- ----------- ----------- -----------
10          20          50          30

(1 row(s) affected)

Si se agrega una sola fila a View3, como esto:

INSERT INTO View3 (z) VALUES (51)

A continuación, obtendrá estos resultados, observe las filas del doble:

a           b           z           c
----------- ----------- ----------- -----------
NULL        NULL        50          NULL
NULL        NULL        51          NULL
10          20          NULL        30

(3 row(s) affected)

a           b           z           c
----------- ----------- ----------- -----------
10          20          50          30
10          20          51          30

(2 row(s) affected)

a           b           z           c
----------- ----------- ----------- -----------
10          20          50          30
10          20          51          30

(2 row(s) affected)

Si entiendo esto: ¿Estás tratando de "colapso de sus resultados y deshacerse de todos los nulos? Si es así, será siempre el resultado de vista3 corresponden a un resultado de Vista1 / View2? Si es así, ¿cuál es la relación? Si no, ¿el número de resultados al menos partido?

Opiniones de múltiples registros, el enfoque ROW_NUMBER () trabajó para mí. La Selección de 1 k enfoque se devuelve un producto cartesiano.

SELECT SQ1.a, SQ1.b, SQ2.z, SQ1.c
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY a) k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT ROW_NUMBER() OVER (ORDER BY b) k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

Puede ser que usted está buscando algo como esto? (Sólo una conjetura salvaje)

SELECT 
  VIEW1.a,
  VIEW1.b,
  (SELECT TOP 1 z FROM VIEW3) AS z,
  VIEW2.c
FROM
  VIEW1, VIEW2 
WHERE
  VIEW1.a = VIEW2.a

Los resultados de cualquier SQL SELECT, incluyendo una unión, son un conjunto estático de columnas. (No polimorfismo.)

Pero usted no tiene que utilizar todas las columnas en cada fila, se utilizan valores nulos en las filas en las que la columna no tiene un valor. También sugiero que incluye una fila de 'tipo' por lo que el cliente puede decirle el tipo (y columnas interesantes) para una fila dada.

Ejemplo:

 (Select
   'room' as view_type
 , rooms.room as room
 , NULL as color
 From rooms 
 )
UNION ALL
(Select
  'color' as view_type
 , NULL as room
 , colors.color as color
 From colors 
)

En realidad se desea una combinación cruzada:

seleccione v1.a, v1.b, VIEW3.z, v1.c de (SELECT a, b, c, DE VIEW1, VIEW2 donde VIEW1.a = VIEW2.a) como v1 CROSS JOIN VIEW3

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top