sql >> Base de Datos >  >> RDS >> Sqlserver

Combina dos tablas que no tienen campos comunes

Hay varias formas de hacer esto, dependiendo de lo que realmente 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 tenga 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 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 es como un producto cartesiano pero el where La cláusula limita cómo se combinan las filas para formar los resultados (por lo que, en realidad, no es un producto cartesiano).

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 u 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 independientes 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.