Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combine two tables that have no common fields

I want to learn how to combine two db tables which have no fields in common. I've checked UNION but MSDN says :

The following are basic rules for combining the result sets of two queries by using UNION:

  1. The number and the order of the columns must be the same in all queries.
  2. The data types must be compatible.

But I have no fields in common at all. All I want is to combine them in one table like a view.

So what should I do?

like image 631
Tarik Avatar asked Jul 29 '09 05:07

Tarik


People also ask

Can we join two tables without common column in SQL?

There are few ways to combine the two tables without a common column including Cross Join (Cartesian Product) and UNION. This is not a join but can be useful for merging tables in SQL.

Can two tables be join without any relation?

You can only do Cross Join. Other joins can be done only with related tables.

Can you join two tables with different columns?

Merging tables by columns. Multiple tables can be merged by columns in SQL using joins. Joins merge two tables based on the specified columns (generally, the primary key of one table and a foreign key of the other).


1 Answers

There are a number of ways to do this, depending on what you really want. With no common columns, you need to decide whether you want to introduce a common column or get the product.

Let's say you have the two tables:

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

Forget the actual columns since you'd most likely have a customer/order/part relationship in this case; I've just used those columns to illustrate the ways to do it.

A cartesian product will match every row in the first table with every row in the second:

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

That's probably not what you want since 1000 parts and 100 customers would result in 100,000 rows with lots of duplicated information.

Alternatively, you can use a union to just output the data, though not side-by-side (you'll need to make sure column types are compatible between the two selects, either by making the table columns compatible or coercing them in the 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 

In some databases, you can use a rowid/rownum column or pseudo-column to match records side-by-side, such as:

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

The code would be something like:

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

It's still like a cartesian product but the where clause limits how the rows are combined to form the results (so not a cartesian product at all, really).

I haven't tested that SQL for this since it's one of the limitations of my DBMS of choice, and rightly so, I don't believe it's ever needed in a properly thought-out schema. Since SQL doesn't guarantee the order in which it produces data, the matching can change every time you do the query unless you have a specific relationship or order by clause.

I think the ideal thing to do would be to add a column to both tables specifying what the relationship is. If there's no real relationship, then you probably have no business in trying to put them side-by-side with SQL.

If you just want them displayed side-by-side in a report or on a web page (two examples), the right tool to do that is whatever generates your report or web page, coupled with two independent SQL queries to get the two unrelated tables. For example, a two-column grid in BIRT (or Crystal or Jasper) each with a separate data table, or a HTML two column table (or CSS) each with a separate data table.

like image 95
paxdiablo Avatar answered Oct 11 '22 11:10

paxdiablo