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