微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建映射的有效方法

如何解决创建映射的有效方法

我有两个表如下

CITY_A

ID 代码 城市
001 90 巴黎
002 90 巴黎
003 85 巴黎
004 60 悉尼
005 75 悉尼
006 75 悉尼

CITY_B

ID 代码 城市
001 输入 PA
002 退出 PA
003 退出 PA
004 输入 SYD
005 退出 SYD
006 输入 SYD

两个表中的内容相同,但表示方式不同。我在这里CITY 列和 CODE 列的 2 个映射。

CITY_A 的映射

代码 城市 含义
90 巴黎 活跃
85 巴黎 NOT_ACTIVE
60 悉尼 活跃
75 悉尼 NOT_ACTIVE

CITY_B 的映射

代码 城市 含义
输入 PA 活跃
退出 PA NOT_ACTIVE
输入 SYD 活跃
退出 SYD NOT_ACTIVE

现在我必须根据映射比较两个表并找到不匹配的地方。所以我的预期输出

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

Demo on dbfiddle

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。