如果第一个表中已存在值,则SQL Union排除行

时间:2013-08-22 02:21:50

标签: tsql duplicate-removal unions

我希望结合两张桌子。但是,两个表中的某个字段在第二个表中应该具有相同的值,应该排除第二个表记录。

这些是MSSQL 2012表格。

我能想到的唯一方法就是这样讨厌。

选择A,B 来自Tab1 联盟 选择C,D 来自Tab2 其中Tab2.c不在(从Tab1中选择A)

在我的示例中看起来相对干净但是Tab1和tab2的选择具有长而复杂的where子句,我需要在“not in”select语句中复制它。

我见过其他解决方案,但MSSQL没有。有没有更好的例子?

由于

1 个答案:

答案 0 :(得分: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

希望这有帮助