创建映射的有效方法

Efficient way for creating mapping

我有 2 个 table 如下

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

两个 table 中的内容相同,但表示形式不同。我在这里有 2 个映射 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

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

ID CITY RESULT
001 PARIS MATCH
002 PARIS MISMATCH
003 PARIS MATCH
004 SYDNEY MATCH
005 SYDNEY MATCH
006 SYDNEY MISMATCH

目前我正在使用 CASE 和温度 table。太大了。

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 和 table 映射 tables:

值构造函数来实现所需结果的可能方法
WITH CITY_A_MAP AS (
  SELECT * FROM (
    VALUES(90, 'PARIS', 'Active'),(85, 'PARIS', 'Not_Active'),(60, 'SYDNEY', 'Active'),(75, 'SYDNEY', 'Not_Active')
  ) AS MAP(CODE, CITY, MEANING)
),
CITY_B_MAP AS (
  SELECT * FROM (
    VALUES ('IN', 'PA', 'Active'),('OUT', 'PA', 'Not_Active'),('IN', 'SYD', 'Active'),('OUT', 'SYD', 'Not_Active')
  ) AS MAP(CODE, CITY, 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