Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Combinar duas tabelas que não têm campos comuns


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

Digamos que você tenha 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 tem uma relação cliente/pedido/peça neste 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ê deseja, pois 1.000 peças e 100 clientes resultariam em 100.000 linhas com muitas informações duplicadas.

Como alternativa, você pode usar uma união para apenas gerar os dados, embora não lado a lado (você precisará garantir que os tipos de coluna sejam compatíveis entre as duas seleções, tornando as colunas da tabela compatíveis ou coagindo-as no select ):
> 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

Em alguns bancos de dados, você pode usar uma coluna ou pseudocoluna rowid/rownum 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 o where cláusula limita 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 adequadamente pensado. Como o SQL não garante a ordem em que produz os dados, a correspondência pode mudar toda vez que você faz a consulta, a menos que tenha um específico relacionamento ou order by cláusula.

Acho que o ideal seria adicionar uma coluna nas duas tabelas especificando qual é a relação. Se não houver um relacionamento real, então você provavelmente não tem nada a ver com tentar colocá-los lado a lado com o SQL.

Se você quiser apenas 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 é aquela que gera seu relatório ou página da web, juntamente com dois independentes Consultas SQL para obter as duas tabelas não relacionadas. Por exemplo, uma grade de duas colunas em BIRT (ou Crystal ou Jasper), cada uma com uma tabela de dados separada, ou uma tabela HTML de duas colunas (ou CSS), cada uma com uma tabela de dados separada.