正确的方法从SQL Server中的两个表中选择没有要加入的公共字段

时间:2013-07-10 22:53:41

标签: sql sql-server sql-server-2012

回到过去,我曾经写过像这样的选择语句:

SELECT 
table1.columnA, table2.columnA

FROM
table1, table2

WHERE
table1.columnA = 'Some value'

但是我被告知在“FROM”子句中使用逗号分隔的表名不符合ANSI92。应始终有一个JOIN语句。

这导致了我的问题....我想对两个表之间的数据进行比较,但两个表中都没有用于创建连接的公共字段。如果我在FROM子句中使用逗号分隔的表名的“遗留”方法(参见代码示例),那么它的工作完全正常。如果被认为是错误的或不好的做法,我会觉得使用这种方法很不舒服。

任何人都知道在这种情况下该怎么办?

额外信息:

表1包含“地理”数据类型中的位置列表 表2包含不同的“地理位置”列表

我正在编写select语句来比较位置之间的距离。到目前为止,我知道你不能在地理专栏上进行加入?

3 个答案:

答案 0 :(得分:50)

您可以(应该)使用CROSS JOIN。以下查询将与您的相同:

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

或者你甚至可以使用INNER JOIN和一些总是真实的条件:

FROM table1 
INNER JOIN table2 ON 1=1

答案 1 :(得分:1)

建议 - 使用交叉连接时请注意重复的方案。例如,在您的情况下:

  • 表1可能有> 1列作为主键的一部分(比如table1_id, id2,id3,table2_id)
  • 表2可能有> 1列作为主键的一部分(比如table2_id, id3,id4)

因为这两个表之间有共同的键(即一个/另一个中的外键) - 我们最终会得到重复的结果。因此使用以下形式是好的:

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

答案 2 :(得分:1)

交叉连接将有助于连接多个没有公共字段的表。但是在加入时要小心,因为此连接将给出两个表的笛卡尔结果集。 QUERY:

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

加入某些条件的替代方法,如

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

但是应该避免这种类型的查询以提高性能和编码标准。