Показывать все и только строки в таблице 1, а не в таблице 2 (с использованием нескольких столбцов)

#sql-server

#sql-server

Вопрос:

У меня есть одна таблица (Table1), в которой несколько столбцов используются в комбинации: Name, TestName, DevName, Dept. Когда каждый из этих 4 столбцов имеет значения, запись вставляется в таблицу2. Мне нужно подтвердить, что все записи с существующими значениями в каждом из этих полей в 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 
          )
 

Мои подсчеты не суммируются, поэтому я считаю, что это неверно. Можете ли вы посоветовать мне, как лучше всего написать этот запрос для моих нужд?

Комментарии:

1. Будет ли работать замена ‘SELECT NULL’ на ‘SELECT 1’?

2. «Все строки в Table2, которых нет в Table1», — это не то, что делает ваш запрос. Ваш запрос получает все строки в Table1, которых нет в Table2.

3. Извините, Эрик, я неправильно написал вопрос. Я запускаю его правильно, поэтому исправил вопрос

4. Ренат — я недостаточно знаком, поэтому должен его протестировать. Я дам вам знать, я делаю это сейчас. Спасибо!

5. Я получаю то же количество с NULL, что и с 1

Ответ №1:

Вы можете использовать оператор EXCEPT set для этого, если определения таблиц идентичны.

 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

Ответ №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 вероятно, проще.

Ответ №3:

 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))