创建映射的有效方法
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
我有 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