2个表中名称列之间的SQL差异函数

时间:2016-10-27 21:01:01

标签: sql sql-server tsql sql-server-2008-r2 cross-join

我有2个表,其中包含一个名称部分的列,即John Doe有一行用于John,一行用于Doe。这两个表中有不同的名称。我需要从一个表中取名称部分,并将DIFFERENCE得分计算到另一个表中的名称部分。现在我正在使用内部和外部游标来遍历两个表中的每一个。这有效,但需要很长时间才能运行。

是否有一种不同的方法可以加快速度?

我正在尝试做的一个例子:

表1

Name
----
John
Doe
Jan
Smith

表2

Name
-----
Henry
Ford
Ransom
Eli
Olds

这就是我需要的:

DIFFERENCE('John','Henry')
DIFFERENCE('John','Ford')
DIFFERENCE('John','Ransom')
DIFFERENCE('John','Eli')
DIFFERENCE('John','Olds')
DIFFERENCE('Doe','Henry')
DIFFERENCE('Doe','Ford')
DIFFERENCE('Doe','Ransom')
DIFFERENCE('Doe','Eli')
DIFFERENCE('Doe','Olds')
DIFFERENCE('Jane','Henry')
DIFFERENCE('Jane','Ford')
DIFFERENCE('Jane','Ransom')
DIFFERENCE('Jane','Eli')
DIFFERENCE('Jane','Olds')
DIFFERENCE('Smith','Henry')
DIFFERENCE('Smith','Ford')
DIFFERENCE('Smith','Ransom')
DIFFERENCE('Smith','Eli')
DIFFERENCE('Smith','Olds')

现在,我将这些DIFFERENCE分数保存在临时表中以用于测试目的。抱歉没有格式化,我是新来发布的。谢谢你的帮助。

3 个答案:

答案 0 :(得分:5)

我认为 - 你实际上在寻找的是 - CROSS JOIN

简而言之 - join-everything-with-everything join,不需要连接条件。结果是每个可能的值组合,换句话说:笛卡尔积

试试这个:

DECLARE @tbl1 TABLE(Name VARCHAR(100));
INSERT INTO @tbl1 VALUES
 ('John')
,('Doe')
,('Jan')
,('Smith');

DECLARE @tbl2 TABLE(Name VARCHAR(100));
INSERT INTO @tbl2 VALUES
 ('Henry')
,('Ford')
,('Ransom')
,('Eli')
,('Olds');

SELECT t1.Name
      ,t2.Name
      ,DIFFERENCE(t1.Name,t2.Name) AS DiffName
FROM @tbl1 AS t1
CROSS JOIN @tbl2 AS t2

结果

Name    Name    DiffName
John    Henry   2
Doe     Henry   2
Jan     Henry   2
Smith   Henry   2
John    Ford    2
Doe     Ford    2
Jan     Ford    2
Smith   Ford    2
John    Ransom  1
Doe     Ransom  0
Jan     Ransom  1
Smith   Ransom  1
John    Eli     2
Doe     Eli     2
Jan     Eli     2
Smith   Eli     1
John    Olds    0
Doe     Olds    0
Jan     Olds    0
Smith   Olds    1

答案 1 :(得分:2)

您可以使用笛卡尔联接..或CROSS JOIN。

SELECT DIFFERENCE(t1.Name, t2.Name) 
FROM Table1 t1
CROSS JOIN Table2 t2

For Reference

答案 2 :(得分:0)

这是另一种写它的方式,甚至更简单:

SELECT table1.name, table2.name, DIFFERENCE(table1.Name, table2.Name)
FROM table1, table2