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.