仅显示表1中的所有行,而不显示表2中的行(使用多列)

时间:2019-04-18 17:59:18

标签: sql-server

我有一个表(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 
          )

我的计数没有加起来,所以我认为这是不正确的。您能建议我编写满足我需要的查询的最佳方法吗?

3 个答案:

答案 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

这将从第一个表返回不同的行,而第二个表中没有匹配的行。在此处阅读有关EXCEPTINTERSECT的更多信息: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))