【发布时间】:2011-07-27 22:22:41
【问题描述】:
这是我面临的情况:
我有两个表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
【问题讨论】:
-
您使用的是什么 RDBMS 和版本?...顺便问一下,您需要一个查询来说明您的操作吗?您不能只删除或添加一行吗?
-
这个查询是为了生成一个报告,让人工进入并进行编辑(长篇大论)。不用说我没有直接访问数据库来添加/插入/更新/删除记录,只需查询并告诉其他人该做什么。
-
哦,这有点搞砸了......那你应该去@Cybernate的回答
-
如果使用
WHERE O.Operation_Key = 23149条件将WC_Part_Table和WS_Part_Table作为VIEWS没有,您可能会发现更好。然后可以使用 KenTaylor 或 Cybernate 的视图(如果要手动检查结果太多,可以在其中添加任何此类条件)。
标签: sql tsql full-outer-join