内部联接基于100多个属性

时间:2015-03-09 20:30:09

标签: sql inner-join

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

从table_a INNER JOIN table_b中选择*(table_a.name = table_b.name)

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

4 个答案:

答案 0 :(得分:5)

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

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

它会返回两张桌子上所有相同列的所有记录。

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

它不了解您的需求。它对你有帮助吗?

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:0)

SELECT
c1, c2, c3 
FROM t1 
INTERSECT 
SELECT 
c1, c2, c3 
FROM t2