Combine duas tabelas que não possuem campos comuns

Eu quero aprender como combinar duas tabelas de database que não têm campos em comum. Eu verifiquei o UNION, mas o MSDN diz:

A seguir estão as regras básicas para combinar os conjuntos de resultados de duas consultas usando UNION:

  1. O número e a ordem das colunas devem ser os mesmos em todas as consultas.
  2. Os tipos de dados devem ser compatíveis.

Mas eu não tenho campos em comum. Tudo que eu quero é combiná-los em uma tabela como uma visão.

Então, o que eu deveria fazer ?

Desde já, obrigado.

Atenciosamente.

Existem várias maneiras de fazer isso, dependendo do que você realmente quer. Sem colunas comuns, você precisa decidir se deseja introduzir uma coluna comum ou obter o produto.

Vamos dizer que você tem as duas tabelas:

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

Esqueça as colunas reais, pois você provavelmente teria um relacionamento cliente / pedido / peça nesse caso; Acabei de usar essas colunas para ilustrar as maneiras de fazer isso.

Um produto cartesiano corresponderá a todas as linhas da primeira tabela com todas as linhas da 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 

Isso provavelmente não é o que você quer, já que 1000 peças e 100 clientes resultariam em 100.000 linhas com muitas informações duplicadas.

Alternativamente, você pode usar uma união para apenas enviar os dados, embora não lado a lado (você precisará certificar-se de que os tipos de coluna são compatíveis entre as duas seleções, tornando as colunas da tabela compatíveis ou coagindo-as na seleção ):

 > 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 

Em alguns bancos de dados, você pode usar uma coluna rowid / rownum ou pseudo-coluna para corresponder registros lado-a-lado, como:

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

O código seria algo como:

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

Ainda é como um produto cartesiano, mas a cláusula where limita a maneira como as linhas são combinadas para formar os resultados (portanto, não um produto cartesiano, na verdade).

Eu não testei esse SQL para isso, pois é uma das limitações do meu DBMS de escolha, e com razão, não acredito que seja necessário em um esquema bem pensado. Como o SQL não garante a ordem na qual produz dados, a correspondência pode ser alterada toda vez que você faz a consulta, a menos que você tenha um relacionamento específico ou uma cláusula order by .

Acho que o ideal seria adicionar uma coluna às duas tabelas especificando qual é o relacionamento. Se não houver um relacionamento real, provavelmente você não terá que tentar colocá-los lado a lado com o SQL.

Se você quer que eles sejam exibidos lado a lado em um relatório ou em uma página da Web (dois exemplos), a ferramenta certa para fazer isso é o que gera seu relatório ou página da Web, juntamente com duas consultas SQL independentes para obter os dois não relacionados. tabelas. Por exemplo, uma grade de duas colunas no BIRT (ou Crystal ou Jasper), cada uma com uma tabela de dados separada, ou uma tabela de duas colunas de HTML (ou CSS), cada uma com uma tabela de dados separada.

Este é um pedido muito estranho e quase certamente algo que você nunca desejaria fazer em um aplicativo do mundo real, mas, do ponto de vista puramente acadêmico, é um desafio interessante. Com o SQL Server 2005, você poderia usar expressões de tabela comuns e as funções row_number () e juntar-se a isso:

 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 

Isso funciona, mas é extremamente bobo e eu o ofereço apenas como uma “wiki da comunidade”, porque eu realmente não o recomendaria.

 SELECT * FROM table1, table2 

Isso unirá todas as linhas da tabela 1 com a tabela 2 (o produto cartesiano) retornando todas as colunas.

Se as tabelas não tiverem campos comuns, não será possível combinar os dados em nenhuma visualização significativa. Você provavelmente acabaria com uma exibição que contém dados duplicados de ambas as tabelas.

Para obter uma visão útil / significativa das duas tabelas, você normalmente precisa determinar um campo de identificação de cada tabela que possa ser usado na cláusula ON em um JOIN.

Então, na sua opinião:

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

Você menciona que nenhum campo é “comum”, mas, embora os campos de identificação possam não ter o mesmo nome ou mesmo ser o mesmo tipo de dados, você poderia usar as funções convert / cast para uni-los de alguma forma.

por que você não usa uma abordagem simples?

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

Ele fornece todas as colunas das duas tabelas e retorna todos os registros do cliente e fornecedor, se o Cliente tiver 3 registros e o fornecedor tiver 2, e o fornecedor mostrará NULL em todas as colunas.

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

se seus dados de aarm, é preciso muito tempo ..

 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 t1.col table1col, t2.col table2col FROM table1 t1 JOIN table2 t2 on t1.table1Id = x and t2.table2Id = y 

experimentar:

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

Isso trará todas as colunas da tabela.

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

Por favor, tente esta consulta:

Combine duas tabelas que não possuem colunas comuns:

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