Saltar al contenido

Combina dos tablas que no tienen campos comunes

Si encuentras algún detalle que no comprendes puedes comentarlo y te responderemos lo más rápido posible.

Solución:

Hay varias maneras de hacer esto, dependiendo de lo que De Verdad querer. Sin columnas comunes, debe decidir si desea introducir una columna común u obtener el producto.

Digamos que tienes las dos tablas:

parts:              custs:
+----+----------+   +-----+------+
| id | desc     |   |  id | name |
+----+----------+   +-----+------+
|  1 | Sprocket |   | 100 | Bob  |
|  2 | Flange   |   | 101 | Paul |
+----+----------+   +-----+------+

Olvídese de las columnas reales ya que lo más probable es que tener una relación cliente/pedido/pieza en este caso; Acabo de usar esas columnas para ilustrar las formas de hacerlo.

Un producto cartesiano hará coincidir cada fila de la primera tabla con cada fila de la segunda:

> select * from parts, custs;
      id desc     id  name
      -- ----     --- ----
      1  Sprocket 101 Bob
      1  Sprocket 102 Paul
      2  Flange   101 Bob
      2  Flange   102 Paul

Probablemente no sea eso lo que desea, ya que 1000 piezas y 100 clientes darían como resultado 100 000 filas con mucha información duplicada.

Alternativamente, puede usar una unión para generar solo los datos, aunque no uno al lado del otro (deberá asegurarse de que los tipos de columna sean compatibles entre las dos selecciones, ya sea haciendo que las columnas de la tabla sean compatibles o forzándolas en la selección ):

> select id as pid, desc, null as cid, null as name from parts
  union
  select null as pid, null as desc, id as cid, name from custs;
    pid desc     cid name
    --- ----     --- ----
                 101 Bob 
                 102 Paul
    1   Sprocket
    2   Flange

En algunas bases de datos, puede usar una columna o una pseudocolumna de ID de fila/número de fila para hacer coincidir los registros uno al lado del otro, como:

id desc     id  name
-- ----     --- ----
1  Sprocket 101 Bob
2  Flange   101 Bob

El código sería algo como:

select a.id, a.desc, b.id, b.name
from parts a, custs b
where a.rownum = b.rownum;

Todavía me gusta un producto cartesiano pero el where La cláusula limita cómo se combinan las filas para formar los resultados (por lo que no es un producto cartesiano en absoluto, en realidad).

No he probado ese SQL para esto, ya que es una de las limitaciones de mi DBMS de elección, y con razón, no creo que sea necesario en un esquema bien pensado. Dado que SQL no garantiza el orden en que produce los datos, la coincidencia puede cambiar cada vez que realiza la consulta, a menos que tenga un específico relación o order by cláusula.

Creo que lo ideal sería agregar una columna a ambas tablas especificando cuál es la relación. Si no hay una relación real, entonces probablemente no tenga nada que hacer al tratar de ponerlos lado a lado con SQL.

Si solo desea que se muestren uno al lado del otro en un informe o en una página web (dos ejemplos), la herramienta adecuada para hacerlo es lo que genere su informe o página web, junto con dos independiente Consultas SQL para obtener las dos tablas no relacionadas. Por ejemplo, una cuadrícula de dos columnas en BIRT (o Crystal o Jasper) cada una con una tabla de datos separada, o una tabla HTML de dos columnas (o CSS) cada una con una tabla de datos separada.

Esta es una solicitud muy extraña, y casi con seguridad algo que nunca querrías hacer en una aplicación del mundo real, pero desde un punto de vista puramente académico es un desafío interesante. Con SQL Server 2005, puede usar expresiones de tabla comunes y las funciones row_number() y unirse a eso:

with OrderedFoos as (
    select row_number() over (order by FooName) RowNum, *
    from Foos (nolock)
),
OrderedBars as (
    select row_number() over (order by BarName) RowNum, *
    from Bars (nolock)
)
select * 
from OrderedFoos f
    full outer join OrderedBars u on u.RowNum = f.RowNum

Esto funciona, pero es sumamente tonto y lo ofrezco solo como una respuesta de “wiki de la comunidad” porque realmente no lo recomendaría.

SELECT *
FROM table1, table2

Esto unirá cada fila en la tabla 1 con la tabla 2 (el producto cartesiano) devolviendo todas las columnas.

Si te sientes incitado, tienes la opción de dejar un ensayo acerca de qué te ha parecido este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *