2013-08-22 47 views
1

我有兩個我希望結合的表。但是,兩個表中都有一個字段應該在第二個表中具有相同的值,第二個表中的記錄應該被排除。SQL Union排除行如果值已經存在於第一個表中

這些是MSSQL 2012表。

我能想到的唯一方法就是像這樣令人討厭的東西。

選擇A,B 從TAB1 聯盟 選擇C,d 從TAB2 其中Tab2.c不在(選擇A從TAB1)

看起來比較乾淨的在我的例子,但對於選擇TAB1和tab2有很長和複雜的條款和我需要在「不在」選擇語句中重複。

我見過其他解決方案,但沒有在MSSQL中。任何一個有更好的例子?

由於

回答

0

以及在T-SQL我使用這種代碼

USE tempdb 
GO 
CREATE TABLE StudentDetails 
(
StudentID INTEGER PRIMARY KEY, 
StudentName VARCHAR(15) 
) 
GO 
INSERT INTO StudentDetails 
VALUES(1,'SMITH') 
INSERT INTO StudentDetails 
VALUES(2,'ALLEN') 
INSERT INTO StudentDetails 
VALUES(3,'JONES') 
INSERT INTO StudentDetails 
VALUES(4,'MARTIN') 
INSERT INTO StudentDetails 
VALUES(5,'JAMES') 
GO 
CREATE TABLE StudentTotalMarks 
(
StudentID INTEGER REFERENCES StudentDetails, 
StudentMarks INTEGER 
) 
GO 
INSERT INTO StudentTotalMarks 
VALUES(1,230) 
INSERT INTO StudentTotalMarks 
VALUES(2,255) 
INSERT INTO StudentTotalMarks 
VALUES(3,200) 
GO 
-- Select from Table 
SELECT * 
FROM StudentDetails 
GO 
SELECT * 
FROM StudentTotalMarks 
GO 
-- Merge Statement 
MERGE StudentTotalMarks AS stm 
USING (SELECT StudentID,StudentName FROM StudentDetails) AS sd 
ON stm.StudentID = sd.StudentID 
WHEN MATCHED AND stm.StudentMarks > 250 THEN DELETE 
WHEN MATCHED THEN UPDATE SET stm.StudentMarks = stm.StudentMarks + 25 
WHEN NOT MATCHED THEN 
INSERT(StudentID,StudentMarks) 
VALUES(sd.StudentID,25); 
GO 
-- Select from Table 
SELECT * 
FROM StudentDetails 
GO 
SELECT * 
FROM StudentTotalMarks 
GO 
-- Clean up 
DROP TABLE StudentDetails 
GO 
DROP TABLE StudentTotalMarks 
GO 

合併聯接執行得很好,獲得以下結果。 http://www.pinaldave.com/bimg/MergeStatement.gif

希望這有助於

相關問題