以下是我面临的情况:
我有两个表A和B.如果记录在表A中而不在表B中,则需要将它们添加到表B.如果记录在表B中而不在表A中,则需要将它们删除表B.这里的诀窍是它是两个键的混合,使得独特的组合
Table A
Operation_Key Part_Key
1 1
1 2
2 1
2 3
Table B
Operation_Key Part_Key Record_Key
1 1 1
2 1 2
2 3 3
2 4 4
我正在尝试获取正确类型的查询,以便返回的结果类似于
Results
Operation_Key Part_Key Record_Key Action
1 2 NULL Add
2 4 4 Delete
到目前为止,我的查询看起来与此类似:
CREATE TABLE #Action_Table
(
Action VARCHAR(6),
Action_Bit INT,
Operation_Key INT,
Record_Key INT,
Part_Key INT
)
INSERT INTO #Action_Table
SELECT
CASE
WHEN WS.Operation_Key IS NULL THEN 'Delete'
WHEN WS.Operation_Key IS NOT NULL THEN 'Add'
END Action,
CASE
WHEN WS.Operation_Key IS NULL THEN '0'
WHEN WS.Operation_Key IS NOT NULL THEN '1'
END Action_Bit,
CASE
WHEN WS.Operation_Key IS NULL THEN WC.Operation_Key
WHEN WS.Operation_Key IS NOT NULL THEN WS.Operation_Key
END Operation_Key,
CASE
WHEN WS.Operation_Key IS NULL THEN WC.Record_Key
WHEN WS.Operation_Key IS NOT NULL THEN NULL
END Workcenter_Component_Key,
CASE
WHEN WS.Operation_Key IS NULL THEN WC.Part_Key
WHEN WS.Operation_Key IS NOT NULL THEN WS.Part_Key
END Part_Key
FROM #WS_Part_Table WS
FULL OUTER JOIN #WC_Part_Table WC
ON WC.Part_Key = WS.Part_Key
AND WC.Operation_Key = WS.Operation_Key
WHERE (WS.Part_Key IS NULL or WC.Part_Key IS NULL) AND (WS.Operation_Key IS NULL or WC.Operation_Key IS NULL)
#WS_Part_Table和#WC_Part_Table都是我正在使用查询构建的临时表,但我的困境是我必须 PRE-QUERY 关于操作键的#WC_Part_Table查询我很感兴趣,否则我会得到太多结果。
这是我用来创建#WC_Part_Table
的查询 CREATE TABLE #WC_Part_Table
(
Operation_Key INT,
Record_Key INT,
Part_Key INT
)
-- Workcenter Component Table
INSERT INTO #WC_Part_Table
SELECT
O.Operation_Key,
WC.Record_Key,
WC.Part_Key
FROM Workcenter_Component WC
JOIN Operation O
ON O.Default_Workcenter_Key = WC.Workcenter_Key
/* There is some reason why this next line is needed */
WHERE O.Operation_Key = 23149
答案 0 :(得分:8)
发送此信息以获得您发布的结果:
SELECT COALESCE(a.Operation_Key, b.Operation_Key) Operation_Key,
COALESCE(a.Part_Key, b.Part_Key) Part_Key,
Record_Key,
CASE
WHEN Record_Key IS NULL THEN 'Add'
ELSE 'Delete'
END Action
FROM TableA a FULL OUTER JOIN TableB b
ON a.Operation_Key = b.Operation_Key
AND a.Part_Key = b.Part_Key
WHERE (a.Operation_Key IS NULL) OR (b.Operation_Key IS NULL)
测试脚本:
CREATE TABLE #TableA
(
Operation_Key INT,
Part_Key INT
)
INSERT INTO #TableA
SELECT 1,1
UNION
SELECT 1,2
UNION
SELECT 2,1
UNION
SELECT 2,3
CREATE TABLE #TableB
(
Operation_Key INT,
Part_Key INT,
Record_Key INT
)
INSERT INTO #TableB
SELECT 1,1,1
UNION
SELECT 2,1,2
UNION
SELECT 2,3,3
UNION
SELECT 2,4,4
SELECT COALESCE(a.Operation_Key, b.Operation_Key) Operation_Key,
COALESCE(a.Part_Key, b.Part_Key) Part_Key,
Record_Key,
CASE
WHEN Record_Key IS NULL THEN 'Add'
ELSE 'Delete'
END Action
FROM #TableA a FULL OUTER JOIN #TableB b
ON a.Operation_Key = b.Operation_Key
AND a.Part_Key = b.Part_Key
WHERE (a.Operation_Key IS NULL) OR (b.Operation_Key IS NULL)
<强>输出:强>
Operation_Key Part_Key Record_Key Action
1 2 NULL Add
2 4 4 Delete
答案 1 :(得分:2)
添加到B:
insert into B (Operation_Key, Part_Key, Record_Key)
values
select Operation_Key, Part_Key, null as Record_Key from A
left join b on a.Operation_Key = b.Operation_Key and
a.Part_Key = b.Part_Key
where b.Part_Key is null
从B中删除:
Delete from B
select * from B left join A on b.Operation_Key = a.Operation_Key and
b.Part_Key = a.Part_Key
where a.Operation_Key is null
答案 2 :(得分:2)
通过巧妙地使用SQL“COALESCE”运算符,您可以获得所需的结果表(查看示例设置)。如果您使用这样的查询:
SELECT
COALESCE(A.Operation_Key, B.Operation_Key) as Operation_Key,
COALESCE(A.part_key, B.part_key) as Part_Key,
B.Record_Key,
CASE WHEN A.Operation_Key IS NULL THEN
'Delete'
ELSE
'Add'
END AS [Action] FROM A
FULL OUTER JOIN B
ON A.Operation_Key = B.Operation_Key
AND A.Part_Key= B.Part_Key
WHERE A.Operation_Key IS NULL
OR B.Operation_Key IS NULL
...你会得到一个与你的例子完全相同的结果表。