sql: unión de dos resultados de consulta por columnas

CorePress2024-01-24  9

Diga si tengo dos consultas que devuelven dos tablas con el mismo número de filas. Por ejemplo, si la consulta 1 devuelve

| a | b | c |
| 1 | 2 | 3 |
| 4 | 5 | 6 |

y consulta 2 devuelve

| d  | e  | f  |
| 7  | 8  | 9  |
| 10 | 11 | 12 |

Cómo obtener lo siguiente, suponiendo que ambas consultas sean opacas

| a | b | c | d  | e  | f  |
| 1 | 2 | 3 | 7  | 8  | 9  |
| 4 | 5 | 6 | 10 | 11 | 12 |

Mi solución actual es agregar a cada consulta una columna de número de fila y unirlas internamente. en esta columna.

SELECT
    q1_with_rownum.*,
    q2_with_rownum.*
FROM (
    SELECT ROW_NUMBER() OVER () AS q1_rownum, q1.*
    FROM (.......) q1
) q1_with_rownum
INNER JOIN (
    SELECT ROW_NUMBER() OVER () AS q2_rownum, q2.*
    FROM (.......) q2
) q2_with_rownum
ON q1_rownum = q2_rownum

Sin embargo, si hay una columna denominada q1_rownum en cualquiera de las consultas, lo anterior se romperá. No me es posible investigar q1 o q2; la única información disponible es que ambas son consultas SQL válidas y no contenga columnas con los mismos nombres. ¿Existe alguna construcción SQL? ¿similar a UNION pero para columnas en lugar de filas?



------------------------------------

No existe tal función. Una fila en una tabla es una entidad.

Si está creando código genérico para ejecutar en cualquier tabla, puede intentar utilizar valores menos comunes, como "un número de fila de consulta inusual" - o algo más esotérico que eso. Sugeriría usar el mismo nombre en ambas tablas y luego usar la cláusula de uso para la unión.



------------------------------------

No estoy seguro de haber entendido exactamente tu problema, pero creo que te refieres a que tanto q1 como q2 están unidos en una columna con el mismo nombre.

DeberíasAgregue el nombre de cada tabla antes de la columna para distinguir a qué columna se hace referencia: "tabla1"."nombredecolumnasimilar" = "tabla2"."nombredecolumnasimilar"

EDITAR: Entonces, el problema es que si ya existe una columna con el mismo alias que su ROW_NUMBER(), no se puede realizar JOIN porque tiene un nombre de columna ambiguo.

La solución más sencilla si no puedes conocer las columnas de tu tabla entrante es crear un alias sólido, por ejemplo _query_join_row_number

EDITAR2: Podría considerar anteponer a todas las columnas el nombre de su tabla original, eliminando así cualquier conflicto (obtendrá q1_with_rows.rows y la columna de conflicto es q1_with_rows.q1.rows) una pila de ejemplo sobre esto: en una unión, cómo anteponer a todos los nombres de columnas la tabla de donde proviene

6

Además, asegúrese de que sus filas coincidan donde desea con un ORDER BY, si no hay una identificación para ninguna de las consultas. Si cada fila tiene significado como "cliente1" y "cliente2" quién debería tener sus propios resultados en la columna "a" y "f" no mezclado

-Laurelg

27/03/2021 a las 17:50

No lo soyNo puedo examinar ninguna de las consultas porque son cadenas SQL ingresadas por el usuario, por lo que no sé qué columnas contiene "tabla1". en realidad tiene... Si "tabla1" ya tengo una columna llamada "rownum" chocará con mi SELECT ROW_NUMBER() OVER () AS rownum

Usuario12986714

27/03/2021 a las 17:54

No puedo creer que lo haya olvidado, pero Gordon Linoff acertó. USING (columna) es un atajo para ON tabla1.columna = tabla2.columna.

-Laurelg

27/03/2021 a las 17:56

Ah, entonces tu pregunta no está relacionada con JOIN, sino con si se puede usar el alias. Creo que el nombre predeterminado generado es número_fila de todos modos, ¿solo usarlo?

-Laurelg

27/03/2021 a las 18:00

Básicamente, tengo dos tablas con el mismo número de filas (y todos los nombres de columnas distintos). Quiero crear una tercera tabla que contenga columnas de ambas tablas. No me es posible saber qué columnas tiene realmente cada tabla, así que no SELECCIONAR q1.col_1, q1.col_2, etc.

Usuario12986714

27/03/2021 a las 18:04

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare