我有一个表(Table1),该表有几列组合使用:Name,TestName,DevName,Dept。当这4列中的每一个都有值时,记录将插入到Table2中。我需要确认Table1内每个字段中具有现有值的所有记录均已正确复制到表2中。
我已经为其创建了一个查询:
SELECT DISTINCT wr.Name,wr.TestName, wr.DEVName ,wr.Dept
FROM table2 wr
where NOT EXISTS (
SELECT NULL
FROM TABLE1 ym
WHERE ym.Name = wr.Name
AND ym.TestName = wr. TestName
AND ym.DEVName = wr.DEVName
AND ym. Dept = wr. Dept
)
我的计数没有加起来,所以我认为这是不正确的。您能建议我编写满足我需要的查询的最佳方法吗?
答案 0 :(得分:2)
如果表定义相同,则可以使用EXCEPT
集运算符。
SELECT DISTINCT ym.Name, ym.TestName, ym.DEVName, ym.Dept
FROM table1 ym
EXCEPT
SELECT DISTINCT wr.Name, wr.TestName, wr.DEVName, wr.Dept
FROM table2 wr
这将从第一个表返回不同的行,而第二个表中没有匹配的行。在此处阅读有关EXCEPT
和INTERSECT
的更多信息:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/set-operators-except-and-intersect-transact-sql?view=sql-server-2017
答案 1 :(得分:2)
您的查询应完成这项工作。它检查Table1
中的所有内容,但不检查Table2
SELECT ym.Name, ym.TestName, ym.DEVName, ym.Dept
FROM Table1 ym
WHERE NOT EXISTS (
SELECT 1
FROM table2
WHERE ym.Name = Name AND ym.TestName = TestName AND ym.DEVName = DEVName AND ym. Dept = Dept
)
如果两个表的结构相同,则EXCEPT
可能会更简单。
答案 2 :(得分:0)
IF OBJECT_ID(N'tempdb..#table1') IS NOT NULL drop table #table1
IF OBJECT_ID(N'tempdb..#table2') IS NOT NULL drop table #table2
create table #table1 (id int, value varchar(10))
create table #table2 (id int)
insert into #table1(id, value) VALUES (1,'value1'), (2,'value2'), (3,'value3')
--test here. Comment next line
insert into #table2(id) VALUES (1) --Comment/Uncomment
select * from #table1
select * from #table2
select #table1.*
from #table1
left JOIN #table2 on
#table1.id = #table2.id
where (#table2.id is not null or not exists (select * from #table2))