【问题标题】:inner join based on over 100 attributes基于 100 多个属性的内连接
【发布时间】:2015-03-09 20:30:09
【问题描述】:

我想基于所有列执行 INNER JOIN。我知道你可以做到:

select * from table_a INNER JOIN table_b on (table_a.name = table_b.name)

根据两个表的name 属性执行内连接。但是,如果我有超过 100 个属性。有没有更简单的方法,而不是编写每个属性来进行比较?

【问题讨论】:

  • 对两个表中的每一列进行连接是一个非常不寻常的要求;它建议您只需要在表 A 和 B 中都存在相同的记录。这是正确的吗?因为可能有更好的方法来实现这一点。你到底想用这个查询的结果做什么?

标签: sql inner-join


【解决方案1】:

所有列都应该具有相同的值? 那么,在这种情况下,为什么不使用 INTERSECT 方式呢?

Select c1, c2, c3 from t1
INTERSECT
Select c1, c2, c3 from t2

它将为您返回两个表上所有相同列的所有记录。

如果您需要一些额外的字段,您可以使用与子查询相同的解决方案。

它不知道你的需求。对你有帮助吗?

【讨论】:

  • 好建议 (+1),但并非所有主要数据库都支持 INTERSECT;以 MySql 为例。 OP 没有用特定的 RDBMS 标记问题,所以很难知道这是否对他有用。
  • 我同意你的看法。这将取决于使用的数据库。如果真的需要,使用哈希也是一个好方法,就像你建议的那样,但它应该是动态的,如果数据库支持的话,就像基于函数的索引一样。否则应用程序应该有这个控件。我们应该使用我们拥有的枪支。
  • 如果有帮助,我正在使用 nzsql
  • 这仅返回连接列,不返回其他列。这是一个非常专业的解决方案,当需要一个额外的列时必须完全重写。
  • @usr 如果您还需要其他列,可以将此解决方案用作子查询。我不知道问题的本质,我只是想帮助他找到可能的解决方案。
【解决方案2】:

不,没有。我建议您自己编写一个小查询来生成此 T-SQL 代码。它完全使用动态 SQL。

【讨论】:

    【解决方案3】:

    如果您确实必须检查所有 100 列以确保唯一的连接,那么这是唯一的方法,而加快此过程的唯一方法是让计算机以某种方式生成原始 SQL。我知道的大多数 SQL 管理接口都不支持这种东西。

    如果要多次执行此连接,那么我建议在两个数据库中查找或创建一个保证唯一的列,并且您可以使用它来连接更少的列。如果数据是相对静态的,并且现在发现的连接预计将无限期保持有效,那么我将在一个数据库中生成一个 GUID,并根据 100 列连接将值复制到另一个数据库;这样,您只需进行一次昂贵的加入。将该列作为两个表的索引将进一步加快未来的查询。

    还可以计算记录的哈希摘要;理想情况下,如果两个记录之间的两个字段不同,它们将具有不同的哈希值。这样做的好处是两个系统都可以独立计算哈希值;如果他们使用相同的算法和相同的输入,他们会得到相同的答案。

    如果您确实在两个表之间有一个 100 列的“候选键”,那么您在数据库设计中就存在根本性的失败。这 100 列不应该在同一个表中,因为它们的子集表示现实世界模型中某个更高抽象级别的实体,可以在第二个表的“子”记录中唯一引用,或者否则,这个数据集合描述了一些可以被赋予单个独立唯一标识符的实体。

    【讨论】:

    • 我的猜测是,他要么将当前表与存档/历史/日志表进行比较,要么将同一个人在不同日期或不同人多次完成的数据输入进行比较。如果他在比较当前和历史数据,他可以使用时间戳,如果他在比较重复的数据条目,他可以遍历 100 多个字段以查找差异。不过,不确定他在做什么,因此没有人可以提出合适的替代方案。
    【解决方案4】:
    SELECT
    c1, c2, c3 
    FROM t1 
    INTERSECT 
    SELECT 
    c1, c2, c3 
    FROM t2
    

    【讨论】:

      猜你喜欢
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多