【发布时间】:2021-04-25 14:04:34
【问题描述】:
我有 2 个如下表
CITY_A
| ID | CODE | CITY |
|---|---|---|
| 001 | 90 | PARIS |
| 002 | 90 | PARIS |
| 003 | 85 | PARIS |
| 004 | 60 | SYDNEY |
| 005 | 75 | SYDNEY |
| 006 | 75 | SYDNEY |
CITY_B
| ID | CODE | CITY |
|---|---|---|
| 001 | IN | PA |
| 002 | OUT | PA |
| 003 | OUT | PA |
| 004 | IN | SYD |
| 005 | OUT | SYD |
| 006 | IN | SYD |
两个表中的内容相同,但表示方式不同。我在这里为CITY 列和CODE 列有两个映射。
CITY_A 的映射
| CODE | CITY | MEANING |
|---|---|---|
| 90 | PARIS | ACTIVE |
| 85 | PARIS | NOT_ACTIVE |
| 60 | SYDNEY | ACTIVE |
| 75 | SYDNEY | NOT_ACTIVE |
CITY_B 的映射
| CODE | CITY | MEANING |
|---|---|---|
| IN | PA | ACTIVE |
| OUT | PA | NOT_ACTIVE |
| IN | SYD | ACTIVE |
| OUT | SYD | NOT_ACTIVE |
现在我必须根据映射比较两个表并找出不匹配的地方。所以我的预期输出是
| ID | CITY | RESULT |
|---|---|---|
| 001 | PARIS | MATCH |
| 002 | PARIS | MISMATCH |
| 003 | PARIS | MATCH |
| 004 | SYDNEY | MATCH |
| 005 | SYDNEY | MATCH |
| 006 | SYDNEY | MISMATCH |
目前我正在使用 CASE 和 Temp 表。太大了。
SELECT A.ID , CASE WHEN A.CODE = 90 AND A.CITY = 'PARIS' THEN 'ACTIVE'
WHEN A.CODE = 85 AND A.CITY = 'PARIS' THEN 'NOT_ACTIVE'
-- FOR OTHER CITIES
END AS A.CODE_MEANING,
CITY
INTO #TEMP_CITY_A
FROM CITY_A A
SELECT B.ID,CASE WHEN B.CODE = 'IN' AND B.CITY='PA' THEN 'ACTIVE'
WHEN B.CODE = 'OUT' AND B.CITY='PA' THEN 'NOT_ACTIVE'
-- FOR OTHER CITIES
END AS B.CODE_MEANING,
CASE WHEN B.CITY = 'PA' THEN 'PARIS'
WHEN B.CITY = 'SYD' THEN 'SYDNEY'
-- FOR OTHER CITIES
END AS CITY
INTO #TEMP_CITY_B
FROM CITY_B B
SELECT A.ID ,A.CITY,
CASE WHEN A.CODE_MEANING!=B.CODE_MEANING THEN 'MISMATCH' ELSE 'MATCH' END AS RESULT
FROM #TEMP_CITY_A A
JOIN #TEMP_CITY_B B ON A.ID = B.ID AND A.CITY = B.CITY
哪种方式最有效?
【问题讨论】:
-
你为什么不直接
JOINCITY_A和Mapping for CITY_A而不是硬编码值 -
然后创建一个或使用
VALUE构造函数 -
目前还没有
Mapping for CITY_A表:) @Squirrel。那我应该单独创建一个映射表吗?实际上我没有创建表的权限。如果这是最好的方法,那么我会要求它。唯一的问题是所有的批准都需要很长时间 -
如果映射表很大,行很多,最好创建一个表。如果只是几行,可以使用
CTE或VALUE构造函数 -
没那么大。我有大约 25 行。你能举一个
VALUE的例子吗? @松鼠
标签: sql sql-server sql-server-2012