2010-04-20 7 views
1

Comment en SQL pouvez-vous "compresser" ensemble des enregistrements dans des tables séparées (à l'utilitaire UNIX paste(1))?paste (1) dans SQL

Par exemple, en supposant que deux tables, A et B, comme ceci:

A   B 
======== ==== 
Harkness unu 
Costello du 
Sato  tri 
Harper 
Jones 

Comment pourriez-vous produire un seul jeu de résultats

NAME | NUM 
=============== 
Harkness | unu 
Costello | du 
Sato  | tri 
Harper | NULL 
Jones | NULL 

?

+0

Y a-t-il d'autres champs sur les tables, peut-être une clé qui relie les enregistrements de A à B? – Tom

+0

regardez dans la table ** JOIN ** s –

+0

@Tom, non, les tables ne sont pas liées matériellement (pas de clés pour obtenir un mappage un-à-un). – pilcrow

Répondre

4

En SQL Server 2005, Oracle 9i et PostgreSQL 8.4 et plus:

SELECT name, num 
FROM (
     SELECT name, ROW_NUMBER() OVER (ORDER BY id) AS rn 
     FROM a 
     ) qa 
LEFT JOIN 
     (
     SELECT num, ROW_NUMBER() OVER (ORDER BY id) AS rn 
     FROM b 
     ) qb 
ON  qb.rn = qa.rn 
ORDER BY 
     qa.rn 

Notez que ROW_NUMBER() exige que les enregistrements sont explicitement classés.

Si vous n'avez pas de colonne similaire à id, vous ne pouvez pas trier les enregistrements dans un ordre autre qu'alphabétique, car les bases de données relationnelles n'ont pas de concept d'ordre d'enregistrement implicite.

1

Sans certaines informations d'identification pour associer des lignes l'une à l'autre, vous ne devriez pas. La commande ou les enregistrements dans SQL ne devraient pas importer, maintenant si vous avez modifié votre table pour être comme.

ID | NAME 
=============== 
1 | Harkness 
2 | Costello 
3 | Sato 
4 | Harper 
5 | Jones 

ID | Num 
========= 
1| uno 
2 | du 
3 | tri 

Alors simple

SELECT * FROM A LEFT JOIN B ON A.ID=B.ID; 
+0

+1 pour indiquer que "[I] ne devrait pas" faire cela. (C'est vrai, je ne devrais pas.) – pilcrow