如何解决创建映射的有效方法
我有两个表如下
CITY_A
ID | 代码 | 城市 |
---|---|---|
001 | 90 | 巴黎 |
002 | 90 | 巴黎 |
003 | 85 | 巴黎 |
004 | 60 | 悉尼 |
005 | 75 | 悉尼 |
006 | 75 | 悉尼 |
CITY_B
两个表中的内容相同,但表示方式不同。我在这里有 CITY
列和 CODE
列的 2 个映射。
CITY_A
的映射
代码 | 城市 | 含义 |
---|---|---|
90 | 巴黎 | 活跃 |
85 | 巴黎 | NOT_ACTIVE |
60 | 悉尼 | 活跃 |
75 | 悉尼 | NOT_ACTIVE |
CITY_B
的映射
现在我必须根据映射比较两个表并找到不匹配的地方。所以我的预期输出是
ID | 城市 | 结果 |
---|---|---|
001 | 巴黎 | 匹配 |
002 | 巴黎 | 不匹配 |
003 | 巴黎 | 匹配 |
004 | 悉尼 | 匹配 |
005 | 悉尼 | 匹配 |
006 | 悉尼 | 不匹配 |
目前我在临时表中使用 CASE
。太大了。
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
哪种方式最有效?
解决方法
以下是使用带有映射表的表值构造函数的 CTE 实现所需结果的可能方法:
WITH CITY_A_MAP AS (
SELECT * FROM (
VALUES(90,'PARIS','Active'),(85,'Not_Active'),(60,'SYDNEY',(75,'Not_Active')
) AS MAP(CODE,CITY,MEANING)
),CITY_B_MAP AS (
SELECT * FROM (
VALUES ('IN','PA',('OUT',('IN','SYD',MEANING)
)
SELECT A.ID,A.CITY,CASE WHEN MA.MEANING = MB.MEANING THEN 'MATCH' ELSE 'MISMATCH' END AS RESULT
FROM CITY_A A
JOIN CITY_A_MAP MA ON MA.CITY = A.CITY AND MA.CODE = A.CODE
JOIN CITY_B B ON B.ID = A.ID
JOIN CITY_B_MAP MB ON MB.CITY = B.CITY AND MB.CODE = B.CODE
ORDER BY A.ID
输出:
ID CITY RESULT
1 PARIS MATCH
2 PARIS MISMATCH
3 PARIS MATCH
4 SYDNEY MATCH
5 SYDNEY MATCH
6 SYDNEY MISMATCH
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。