SQL 2个表中的名称列之间的差异函数
SQL Difference function between Name Column in 2 Tables
我有 2 个 table 包含名称部分的列,即 John Doe 有一行是 John 的,一行是 Doe 的。 2 table 中的名称不同。我需要从一个 table 中提取名称部分,然后计算另一个中名称部分的差异分数。现在我正在使用内部和外部游标来遍历两个 table 中的每一个。这可行,但需要很长时间才能 运行。
是否有其他方法可以加快速度?
我正在尝试做的一个例子:
Table 1
Name
----
John
Doe
Jan
Smith
Table 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')
现在,我将这些差异分数保存在临时 table 中以用于测试目的。抱歉缺少格式,我是新来这里发帖的。谢谢你的帮助。
您可以使用笛卡尔连接.. 或 CROSS JOIN。
SELECT DIFFERENCE(t1.Name, t2.Name)
FROM Table1 t1
CROSS JOIN Table2 t2
我认为 - 您实际上正在寻找的 - 是 CROSS JOIN
。
它是 - 简而言之 - join-everything-with-everything 不需要连接条件的连接。结果是每个可能的值组合,换句话说:笛卡尔积.
试试这个:
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
这是另一种更简单的写法:
SELECT table1.name, table2.name, DIFFERENCE(table1.Name, table2.Name)
FROM table1, table2
我有 2 个 table 包含名称部分的列,即 John Doe 有一行是 John 的,一行是 Doe 的。 2 table 中的名称不同。我需要从一个 table 中提取名称部分,然后计算另一个中名称部分的差异分数。现在我正在使用内部和外部游标来遍历两个 table 中的每一个。这可行,但需要很长时间才能 运行。
是否有其他方法可以加快速度?
我正在尝试做的一个例子:
Table 1
Name
----
John
Doe
Jan
Smith
Table 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')
现在,我将这些差异分数保存在临时 table 中以用于测试目的。抱歉缺少格式,我是新来这里发帖的。谢谢你的帮助。
您可以使用笛卡尔连接.. 或 CROSS JOIN。
SELECT DIFFERENCE(t1.Name, t2.Name)
FROM Table1 t1
CROSS JOIN Table2 t2
我认为 - 您实际上正在寻找的 - 是 CROSS JOIN
。
它是 - 简而言之 - join-everything-with-everything 不需要连接条件的连接。结果是每个可能的值组合,换句话说:笛卡尔积.
试试这个:
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
这是另一种更简单的写法:
SELECT table1.name, table2.name, DIFFERENCE(table1.Name, table2.Name)
FROM table1, table2