30

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

SELECT 
table1.columnA, table2.columnA

FROM
table1, table2

WHERE
table1.columnA = 'Some value'

但是有人告诉我,在“FROM”子句中使用逗号分隔的表名与 ANSI92 不兼容。应该总是有一个 JOIN 语句。

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

有谁知道在这种情况下该怎么办?

额外信息:

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

我正在编写选择语句来比较位置之间的距离。据我所知,你不能在地理专栏上加入??

4

3 回答 3

53

您可以(应该)使用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
于 2013-07-10T22:58:08.820 回答
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
于 2016-06-26T11:35:44.510 回答
1

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

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

在某些始终为真的条件下加入的替代方法,例如

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

但是为了性能和编码标准,应该避免这种类型的查询。

于 2016-10-27T09:33:08.210 回答