【问题标题】:Correct way to select from two tables in SQL Server with no common field to join on从 SQL Server 中的两个表中选择的正确方法,没有要加入的公共字段
【发布时间】:2013-07-09 01:43:24
【问题描述】:

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

SELECT 
table1.columnA, table2.columnA

FROM
table1, table2

WHERE
table1.columnA = 'Some value'

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

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

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

额外信息:

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

我正在编写选择语句来比较位置之间的距离。据我所知,您不能在地理列上进行 JOIN??

【问题讨论】:

  • 如果没有公共字段,你会如何比较?
  • Table1, Table2 在功能上与Table1 CROSS JOIN Table2 相同,这真的是您想要实现的吗?如果一个表有多于一行,则两个表中的行都会重复...您可能应该给出一些示例输入数据和相应的示例输出数据。
  • 是的 MatBaile,我需要使用交叉连接。谢谢你的帮助

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


【解决方案1】:

您可以(应该)使用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

【讨论】:

    【解决方案2】:

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

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

    在某些总是正确的条件下加入的替代方式,例如

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

    但出于性能和编码标准的考虑,应避免使用此类查询。

    【讨论】:

    • 由于 3 年后重复原始答案而被否决。
    【解决方案3】:

    一个建议 - 使用交叉连接时请注意重复的场景。例如在你的情况下:

    • 表 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-22
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多