我有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分数保存在临时表中以用于测试目的。抱歉没有格式化,我是新来发布的。谢谢你的帮助。
答案 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
答案 2 :(得分:0)
这是另一种写它的方式,甚至更简单:
SELECT table1.name, table2.name, DIFFERENCE(table1.Name, table2.Name)
FROM table1, table2