Combiner deux tables qui n'ont pas de champs communs

je veux apprendre à combiner deux tables db qui n'ont pas de champs en commun. J'ai vérifié le syndicat mais MSDN dit:

voici les règles de base pour combiner les ensembles de résultats de deux requêtes en utilisant UNION:

  1. Le nombre et l'ordre des colonnes doit être le même dans toutes les requêtes.
  2. Les types de données doivent être compatibles.

mais je n'ai aucun domaine en commun. Tout ce que je veux, c'est de combiner dans une table une vue.

que dois-je faire ?

Merci d'avance.

sincèrement.

45
demandé sur Rich Seller 2009-07-29 09:00:23

12 réponses

il y a plusieurs façons de faire cela, selon ce que vous vraiment vous voulez. Sans aucune commune colonnes, vous devez décider si vous voulez introduire une colonne commune ou d'obtenir le produit.

disons que vous avez deux tables:

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

Oubliez les colonnes actuelles puisque vous avez très probablement une relation client/commande/pièce dans ce cas; je viens d'utiliser ces colonnes pour illustrer les façons de le faire.

Un produit cartésien va correspondre à chaque ligne de la première table avec chaque ligne de la seconde:

> select * from parts, custs;
      id desc     id  name
      -- ----     --- ----
      1  Sprocket 101 Bob
      1  Sprocket 102 Paul
      2  Flange   101 Bob
      2  Flange   102 Paul

ce n'est probablement pas ce que vous voulez puisque 1000 pièces et 100 clients résulteraient en 100 000 lignes avec beaucoup d'informations dupliquées.

alternativement, vous pouvez utiliser une union pour juste sortir les données, mais pas côte à côte (vous aurez besoin de s'assurer que les types de colonne sont compatibles entre les deux sélections, soit en rendant les colonnes de table compatibles ou en les faisant pression dans la sélection):

> 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

dans certaines bases de données, vous pouvez utiliser une colonne rowid/rownum ou une pseudo-colonne pour apparier les enregistrements côte à côte, comme:

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

Le code serait quelque chose comme:

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

C'est toujours un produit cartésien mais where la clause limite la façon dont les lignes sont combinées pour former les résultats (donc pas un produit cartésien du tout, vraiment).

Je n'ai pas testé ce SQL pour cela puisque c'est l'un des limites de mon choix de SGBD, et à juste titre, Je ne crois pas que ce soit nécessaire dans un schéma bien pensé. Depuis SQL ne garantit pas l'ordre dans lequel il produit des données, l'appariement peut changer chaque fois que vous faites la requête à moins que vous avez un certains relation ou order by l'article.

je pense que la chose idéale à faire serait d'ajouter une colonne aux deux tables spécifiant ce qu'est la relation. Si il n'y a pas de véritable relation, alors vous avez probablement pas business en essayant de les mettre côte à côte avec SQL.

si vous voulez juste les afficher côte à côte dans un rapport ou sur une page web (deux exemples), l'outil à utiliser est celui qui génère votre rapport ou votre page web, couplé à deux indépendant requêtes SQL pour obtenir les deux tables sans rapport. Par exemple, une grille à deux colonnes en BIRT (ou Crystal ou Jasper) avec chacune une table de données distincte, ou une table HTML à deux colonnes (ou CSS) avec chacune une table de données distincte.

100
répondu paxdiablo 2009-07-29 06:41:40

c'est une requête très étrange, et presque certainement quelque chose que vous ne voudriez jamais faire dans une application du monde réel, mais d'un point de vue purement académique, c'est un défi intéressant. Avec SQL Server 2005, vous pouvez utiliser les expressions courantes de table et les fonctions row_number () et vous joindre à cela:

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

cela fonctionne, mais c'est extrêmement stupide et je l'offre seulement comme réponse "wiki communautaire" parce que je ne le recommanderais vraiment pas.

21
répondu Matt Hamilton 2009-07-29 05:11:52
SELECT *
FROM table1, table2

ceci va rejoindre chaque ligne du tableau 1 avec le tableau 2 (le produit cartésien) retournant toutes les colonnes.

10
répondu James Kolpack 2009-07-29 05:04:38

si les tables n'ont pas de champs communs, alors il n'y a aucun moyen de combiner les données dans une vue significative. Vous finiriez probablement avec une vue qui contient des données dupliquées des deux tables.

3
répondu Craig T 2009-07-29 05:03:15

pour obtenir une vue significative/utile des deux tables, vous avez normalement besoin de déterminer un champ d'identification de chaque table qui peut ensuite être utilisé dans la clause ON dans une jointure.

Alors à votre avis:

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

vous mentionnez qu'aucun champ n'est" commun", mais bien que les champs d'identification puissent ne pas avoir le même nom ou même être le même type de données, vous pouvez utiliser les fonctions convert / cast pour les rejoindre d'une manière ou d'une autre.

2
répondu Ash 2009-07-29 05:10:31

pourquoi ne pas utiliser une approche simple

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

Il vous donne toutes les colonnes des deux tables et renvoie tous les enregistrements de client et de fournisseur si le Client a 3 enregistrements et fournisseur 2 fournisseur vais vous montrer la valeur NULL dans toutes les colonnes

2
répondu dnxit 2012-10-02 23:28:03
Select 
DISTINCT  t1.col,t2col
From table1 t1, table2 t2

OR

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

si ses données de câlin, il prend beaucoup de temps ..

2
répondu mad 2016-09-01 08:18:57

essaie:

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

Cela apportera toutes les colonnes de la table.

2
répondu Jay Momaya 2017-09-02 14:05:38
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;
1
répondu Karthick 2014-05-22 10:17:38
SELECT t1.col table1col, t2.col table2col
FROM table1 t1 
JOIN table2 t2 on t1.table1Id = x and t2.table2Id = y
1
répondu Robby 2016-04-01 14:13:23
select * from this_table;

select distinct person from this_table

union select address as location from that_table 

drop wrong_table from this_database;
0
répondu hard_sense 2014-12-02 03:02:51

s'il vous Plaît essayer cette requête:

Combinez deux tables qui n'ont pas de colonnes communes:

SELECT * 
FROM table1 

UNION 

SELECT * 
FROM table2  
ORDER BY orderby ASC
-2
répondu samarth 2015-10-24 08:35:39