Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Correct way to select from two tables in SQL Server with no common field to join on

Back in the old days, I used to write select statements like this:

SELECT 
table1.columnA, table2.columnA

FROM
table1, table2

WHERE
table1.columnA = 'Some value'

However I was told that having comma separated table names in the "FROM" clause is not ANSI92 compatible. There should always be a JOIN statement.

This leads to my problem.... I want to do a comparison of data between two tables but there is no common field in both tables with which to create a join. If I use the 'legacy' method of comma separated table names in the FROM clause (see code example), then it works perfectly fine. I feel uncomfortable using this method if it is considered wrong or bad practice.

Anyone know what to do in this situation?

Extra Info:

Table1 contains a list of locations in 'geography' data type Table2 contains a different list of 'geography' locations

I am writing select statement to compare the distances between the locations. As far I know you cant do a JOIN on a geography column??

like image 997
volume one Avatar asked Jul 10 '13 22:07

volume one


People also ask

Can you join two tables without common column?

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 we join two tables without using join keyword?

The keywords used to specify join conditions are WHERE , ON , USING , NATURAL and CROSS . WHERE can be used to to create a join between tables without using the keyword JOIN , but it can only be used for inner joins.

Which join is used to take unmatched values from two tables?

Outer joins are joins that return matched values and unmatched values from either or both tables.


3 Answers

You can (should) use CROSS JOIN. Following query will be equivalent to yours:

SELECT 
   table1.columnA
 , table2.columnA
FROM table1 
CROSS JOIN table2
WHERE table1.columnA = 'Some value'

or you can even use INNER JOIN with some always true conditon:

FROM table1 
INNER JOIN table2 ON 1=1
like image 115
Nenad Zivkovic Avatar answered Oct 10 '22 23:10

Nenad Zivkovic


Cross join will help to join multiple tables with no common fields.But be careful while joining as this join will give cartesian resultset of two tables. QUERY:

SELECT 
   table1.columnA
 , table2,columnA
FROM table1 
CROSS JOIN table2

Alternative way to join on some condition that is always true like

SELECT 
   table1.columnA
 , table2,columnA
FROM table1 
INNER JOIN table2 ON 1=1

But this type of query should be avoided for performance as well as coding standards.

like image 41
vinay koul Avatar answered Oct 10 '22 23:10

vinay koul


A suggestion - when using cross join please take care of the duplicate scenarios. For example in your case:

  • Table 1 may have >1 columns as part of primary keys(say table1_id, id2, id3, table2_id)
  • Table 2 may have >1 columns as part of primary keys(say table2_id, id3, id4)

since there are common keys between these two tables (i.e. foreign keys in one/other) - we will end up with duplicate results. hence using the following form is good:

WITH data_mined_table (col1, col2, col3, etc....) AS
SELECT DISTINCT col1, col2, col3, blabla
FROM table_1 (NOLOCK), table_2(NOLOCK))
SELECT * from data_mined WHERE data_mined_table.col1 = :my_param_value
like image 42
ha9u63ar Avatar answered Oct 11 '22 01:10

ha9u63ar