如何使用case来组合sql中表的项的拼写变体

时间:2016-09-30 13:52:08

标签: sql-server

我有两个SQL表,其中部门名称的拼写有偏差。我需要结合使用案例来创建一个位置名称的拼写。 Budget_Rc是两个表中唯一具有相同拼写的。这是一个例子:

Table-1                             table-2
Depart_Name     Room_Loc      Depart_Name     Room_Loc          
1. Finance_P1    P144          1. Fin_P1        P1444
2. Budget_Rc     R2c           2. Budget_Rc     R2c 
3. Payroll_P1_2  P1144         3. Finan_P1_1    P1444  
                               4. PR_P1_2       P1140 

我需要实现的是部门是一个实体,一个房间位置。这些应显示为主表中有一个房间位置的一个(表-1)。

Depart_Name       Room_Loc          
1. Finance_P1     F144           
2. Budget_Rc      R2c            
3. Payroll_P1_2   P1144    

许多人提前感谢!

3 个答案:

答案 0 :(得分:0)

我先试试

DECLARE @AllSpellings TABLE(DepName VARCHAR(100));

INSERT INTO @AllSpellings(DepName)
SELECT Depart_Name FROM tbl1 GROUP BY Depart_Name
UNION
SELECT Depart_Name FROM tbl2 GROUP BY Depart_Name;

SELECT DepName
FROM @AllSpellings
ORDER BY DepName

这将帮助您找到所有现有值......

现在,您创建一个包含IDENTITY ID列的所有部门的干净表。

现在你有两个选择:

如果您无法更改表的布局

使用上部select - 语句查找所有现有条目并创建映射表,您可以将其用作间接链接

更好:真正的FK关系

将部门名称替换为ID,并将其设为FOREIGN KEY REFERENCE

答案 1 :(得分:0)

一个房间可以有多个部门吗?

如果是这样那么它就更难以在没有所有可能的一对多关系的列表的情况下编写动态查询,例如Finance拥有FIN的部门密钥并且他们有这三个名称。您必须定义该表以建立任何关系。

例如:

DEPARTMENT TABLE

ID    NAME     ROOMID
FIN   FINANCE  P1444
PAY   PAYROLL  P1140

DEPARTMENTNAMES

ID DEPARTMENTNAME  DEPARTMENTID
1  Finance_P1      FIN
2  Payroll_P1_2    PAY
3  Fin_P1          FIN

等...

这样您就可以正确匹配所有部门及其名称。我会使用这个匹配表来组织和规范化数据,然后清理所有数据,然后只使用一个单一的部门名称。它将是手动的,但如果你随后清理数据应该是一次。

如果房间只属于一个部门,你可以加入房间,这样会更容易。

答案 2 :(得分:0)

由于没有任何可靠的规则可以将部门名称从第一表映射到第二表,因此我采用的方法是创建一个映射表。该映射表将关联两个部门名称。

mapping

Depart_Name_1 | Depart_Name_2
-----------------------------
Finance_P1    | Fin_P1
Budget_Rc     | Budget_Rc
Payroll_P1_2  | PR_P1_2

然后,您可以进行三向连接以将所有内容整合到一个结果集中:

SELECT t1.*, t2.*
FROM table1 t1
INNER JOIN mapping m
    ON t1.Depart_Name = m.Depart_Name_1
INNER JOIN table2 t2
    ON m.Depart_Name_2 = t2.Depart_Name

创建mapping表可能看起来很乏味,但在这里可能是不可避免的。如果你能想出一种自动化的方法,那么这可以减少在那里度过的时间。