2014-02-11 53 views
-1

我有2個表A和B具有相同的結構。我需要從表A中得到表B中不存在的每一行,然後將它們插入到第3個#temp表C中。SQL比較2 #temp表並將差異插入到第3個#temp表中

每個表有2列需要進行比較,類型和步驟,其餘列是不需要比較的RowID,CreatedDate,CreatedUserID,ModifiedDate和ModifiedUserID。

有一個單獨的語句,我可以使用INSERT INTO #tempC是比較A和B,並會使用TSQL(SQL SERVER 2012)

+1

你當然應該能夠做到這一點' NOT IN'或'NOT EXISTS' – Andrew

+0

感謝@AaronBertrand,這很好,我只是將最後一個FROM改爲#B而不是#C –

回答

2

插入來自不存在於表B的值SQL 2012有EXCEPT語句。這是一個簡單的例子。

CREATE TABLE #TmpA (
Col Varchar(10), 
Irrelevant Int); 

CREATE TABLE #TmpB (
Col Varchar(10)); 

CREATE TABLE #TmpC (
Col Varchar(10)); 

INSERT INTO #TmpA 
SELECT 'A', 0 UNION ALL 
SELECT 'B', 7 UNION ALL 
SELECT 'C', 5 ; 

INSERT INTO #TmpB 
SELECT 'A' UNION ALL 
SELECT 'C' UNION ALL 
SELECT 'D'; 

INSERT INTO #TmpC 
SELECT Col FROM #TmpA 
EXCEPT 
SELECT Col FROM #TmpB 

SELECT * FROM #TmpC; 
DROP TABLE #TmpA, #TmpB, #TmpC; 
以下Blams批判

---而第二個方案

CREATE TABLE #TmpA (
Col Varchar(10), 
Irrelevant Int); 

CREATE TABLE #TmpB (
Col Varchar(10)); 

CREATE TABLE #TmpC (
Col Varchar(10), 
Irrelevant Int); 

INSERT INTO #TmpA 
SELECT 'A', 0 UNION ALL 
SELECT 'B', 7 UNION ALL 
SELECT 'C', 5 ; 

INSERT INTO #TmpB 
SELECT 'A' UNION ALL 
SELECT 'C' UNION ALL 
SELECT 'D'; 

;WITH Exceptions AS (
    SELECT Col FROM #TmpA 
    EXCEPT 
    SELECT Col FROM #TmpB 
) 
INSERT INTO #TmpC 
SELECT A.Col, A.Irrelevant 
FROM #TmpA A 
JOIN Exceptions E ON A.Col = E.Col 

SELECT * FROM #TmpC; 
DROP TABLE #TmpA, #TmpB, #TmpC; 
+0

這隻能插入一列。他需要插入7列,並且僅基於7列中的2列進行排除。 SELECT Col,無關FROM #TmpA除SELECT Col FROM #TmpB失敗 – Paparazzi

+0

@Blam Point採取:我已經添加了第二個場景 –

+0

我認爲我的答案是更直接 – Paparazzi

0
insert into #temp3 (Type, Step, RowID ..) 
select #temp1.Type, #temp1.Step, #temp1.RowID 
    from #temp1 
    left outer join #temp2 
    on #temp1.Type = #temp2.Type 
    and #temp1.Step = #temp2.Step 
where #temp2.Type is null 
-1

感謝阿龍貝特朗,這是最簡單的方法,這是我的發言:

INSERT INTO #C SELECT WFTypeID, WFStepID FROM #A EXCEPT SELECT WFTypeID, WFStepID FROM #B 

感謝其他反應的傢伙,但這是太多的代碼,當你可以在1行:)

+0

所以不清楚,你不希望其他列。但如果你不想要其他欄目,那麼這就是湯姆布朗發佈的確切答案。 – Paparazzi

+0

@Blam - 不清楚? 「每個表有兩列需要比較,類型和步驟,其餘列是RowID,CreatedDate,CreatedUserID,ModifiedDate和ModifiedUserID,不需要比較。」湯姆布朗的回答很好,但我確實提到「是否有一個我可以用來INSERT INTO的陳述」,而且Aaron的評論確實如此,簡單而易於閱讀和理解。 –

+0

不清楚您不希望插入其他列。查看Tom Brown的答案INSERT INTO #TmpC SELECT Col FROM #TmpA EXCEPT SELECT Col FROM #TmpB。你的回答有什麼不同? – Paparazzi