varias unir tablas tabla relacionadas multitablas misma inner hacer ejemplos consultas consultar consulta con como sql-server union

sql-server - tablas - unir dos consultas sql misma tabla



Combina dos tablas que no tienen campos comunes (12)

¿Por qué no usas un enfoque simple?

SELECT distinct * FROM SUPPLIER full join CUSTOMER on ( CUSTOMER.OID = SUPPLIER.OID )

Le da todas las columnas de ambas tablas y devuelve todos los registros del cliente y del proveedor si el cliente tiene 3 registros y el proveedor tiene 2, entonces el proveedor mostrará NULO en todas las columnas

Quiero aprender cómo combinar dos tablas db que no tienen campos en común. Revisé UNION pero MSDN dice:

Las siguientes son reglas básicas para combinar los conjuntos de resultados de dos consultas utilizando UNION:

  1. El número y el orden de las columnas debe ser el mismo en todas las consultas.
  2. Los tipos de datos deben ser compatibles.

Pero no tengo campos en común en absoluto. Todo lo que quiero es combinarlos en una tabla como una vista.

Entonces qué debo hacer ?

Gracias por adelantado.

Sinceramente.


Esta es una solicitud muy extraña, y casi con certeza algo que nunca querría 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 unir 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 supremamente tonto y lo ofrezco solo como una respuesta de "comunidad wiki" porque realmente no lo recomendaría.


Hay varias formas de hacerlo, dependiendo de lo que realmente desee. 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 / orden / parte en este caso; Acabo de utilizar esas columnas para ilustrar las formas de hacerlo.

Un producto cartesiano coincidirá con cada fila en la primera tabla con cada fila en 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 lo que quiere, ya que 1000 partes y 100 clientes generarán 100.000 filas con mucha información duplicada.

Alternativamente, puede usar una unión para simplemente generar los datos, aunque no de lado a lado (deberá asegurarse de que los tipos de columnas 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, '''' as cid, '''' as name from parts union select '''' as pid, '''' 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 rowid / rownum o una pseudocolumna para hacer coincidir los registros uno al lado del otro, como por ejemplo:

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

El código sería algo así como:

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

Sigue siendo como un producto cartesiano, pero la cláusula where limita la forma en que las filas se combinan para formar los resultados (por lo que realmente 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 alguna vez se necesite en un esquema bien pensado. Como SQL no garantiza el orden en que produce los datos, la correspondencia puede cambiar cada vez que realiza la consulta, a menos que tenga una relación específica o una cláusula order by .

Creo que lo ideal sería agregar una columna a ambas tablas especificando cuál es la relación. Si no existe una relación real, entonces probablemente no tenga nada que ver con tratar de ponerlos al lado de 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 hacer eso es lo que genere su informe o página web, junto con dos consultas SQL independientes para obtener los dos no relacionados. mesas. 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.


Para obtener una vista significativa / útil de las dos tablas, normalmente necesita determinar un campo de identificación de cada tabla que luego se pueda usar en la cláusula ON de JOIN.

THen en su punto de vista:

SELECT T1.*, T2.* FROM T1 JOIN T2 ON T1.IDFIELD1 = T2.IDFIELD2

Menciona que no hay campos "comunes", pero aunque los campos de identificación pueden no tener el mismo nombre o incluso ser del mismo tipo de datos, puede usar las funciones de conversión / conversión para unirlos de alguna manera.


Por favor, intente esta consulta:

Combina dos tablas que no tienen columnas comunes:

SELECT * FROM table1 UNION SELECT * FROM table2 ORDER BY orderby ASC


Si las tablas no tienen campos comunes, entonces no hay forma de combinar los datos en una vista significativa. Es más probable que termine con una vista que contenga datos duplicados de ambas tablas.


tratar:

select * from table 1 left join table2 as t on 1 = 1;

Esto traerá todas las columnas de ambas tablas.


SELECT * FROM table1, table2

Esto unirá todas las filas de la tabla 1 con la tabla 2 (el producto cartesiano) y devolverá todas las columnas.


SELECT t1.col table1col, t2.col table2col FROM table1 t1 JOIN table2 t2 on t1.table1Id = x and t2.table2Id = y


Select DISTINCT t1.col,t2col From table1 t1, table2 t2 OR Select DISTINCT t1.col,t2col From table1 t1 cross JOIN table2 t2

si su abrazo de datos, lleva mucho tiempo ...


select status_id, status, null as path, null as Description from zmw_t_status union select null, null, path as cid, Description from zmw_t_path;


select * from this_table; select distinct person from this_table union select address as location from that_table drop wrong_table from this_database;