回到过去,我曾经写过像这样的选择语句:
SELECT
table1.columnA, table2.columnA
FROM
table1, table2
WHERE
table1.columnA = 'Some value'
但是我被告知在“FROM”子句中使用逗号分隔的表名不符合ANSI92。应始终有一个JOIN语句。
这导致了我的问题....我想对两个表之间的数据进行比较,但两个表中都没有用于创建连接的公共字段。如果我在FROM子句中使用逗号分隔的表名的“遗留”方法(参见代码示例),那么它的工作完全正常。如果被认为是错误的或不好的做法,我会觉得使用这种方法很不舒服。
任何人都知道在这种情况下该怎么办?
额外信息:
表1包含“地理”数据类型中的位置列表 表2包含不同的“地理位置”列表
我正在编写select语句来比较位置之间的距离。到目前为止,我知道你不能在地理专栏上进行加入?
答案 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)
建议 - 使用交叉连接时请注意重复的方案。例如,在您的情况下:
因为这两个表之间有共同的键(即一个/另一个中的外键) - 我们最终会得到重复的结果。因此使用以下形式是好的:
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
但是应该避免这种类型的查询以提高性能和编码标准。