Sql запрос поможет получить несовпадающие записи из двух таблиц

#sql #tsql #sql-server-2008

#sql #tsql #sql-server-2008

Вопрос:

Я пытаюсь получить несовпадающие записи из 2 таблиц

Для бывших

 TableA
 ID           Account
 1               Acc1
 2               Acc2
 3               Acc3

 TableB
 Opp          Accountid
 Opp1            1
 Opp2            2
 Opp3            4
  

Мне нужно знать, какой идентификатор учетной записи присутствует в TableB, но не в TableA. Было бы замечательно, если бы кто-нибудь мог предоставить этот запрос.

Требуемой записью будет Opp3 таблицы B

Спасибо

Пради

Ответ №1:

 SELECT B.Accountid 
  FROM TableB AS B 
  LEFT 
  JOIN TableA AS A 
    ON A.ID = B.Accountid 
 WHERE A.ID IS NULL;
  

ЛЕВОЕ СОЕДИНЕНИЕ означает, что оно принимает все строки из первой таблицы — если нет совпадений по первому условию соединения, столбцы результирующей таблицы для таблицы B будут равны нулю — вот почему это работает.

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

1. Я думаю, вы имеете в виду LEFT OUTER JOIN .

2. OUTER — стандартное, но необязательное ключевое слово.

3. Имеет ли значение добавление внешнего соединения?

4. С 2000 года функция OUTER в SQL Server устарела. Университетским профессорам это все еще нравится, но оптимизатор запросов SQL Server означает, что ВНЕШНИЕ, ВНУТРЕННИЕ И ПРАВИЛЬНЫЕ ключевые слова больше не нужны вообще. ОБЪЕДИНЕНИЕ подразумевает ВНУТРЕННЕЕ, а ЛЕВОЕ СОЕДИНЕНИЕ подразумевает ВНЕШНЕЕ.

5. Дэвид, что-то не так с запросом .. я не получаю правильного результата. Если вы используете данные, указанные Nighil ниже. я получаю результат одного, двух и четырех

Ответ №2:

 create table #one (id int,acc nvarchar(25))
insert into #one (id , acc) values(1,'one') 
insert into #one (id , acc) values(2,'two') 
insert into #one (id , acc) values(3,'three') 

create table #two (acct nvarchar(25),ids int)
insert into #two (acct,ids) values('one',1) 
insert into #two (acct,ids) values('two',3) 
insert into #two (acct,ids) values('four',4) 

select ids from #two EXCEPT select id from #one 

drop table #one 
drop table #two 
  

протестируйте это

Ответ №3:

 SELECT B.Accountid
FROM TableB AS B 
LEFT JOIN TableA AS A ON A.ID = B.Accountid 
WHERE A.ID IS NULL
  

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

1. Это точно такой же ответ, как и тот, который дал Дэвид Феллс.

2. @mrt На самом деле это не так. Ответ Дэвида Феллса не работает из-за отсутствия where ключевого слова.

Ответ №4:

попробуйте это

 (select * from t1
except 
select * from t2)

union

(select * from t2
except 
select * from t1)
  

думая, что у вас одинаковое количество столбцов в обеих таблицах

упомянутый выше запрос select ids из # two, ЗА исключением select id из # one, выдаст вам несовпадающие строки только из # two. это будет пренебрегать #one

Ответ №5:

Это приведет к одинаковым результатам.

 select * from TableB where Accountid not in (select ID from TableA)
  

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

1. генерируйте те же результаты с помощью what. Пожалуйста, уточните, поскольку ваш ответ довольно запутан без контекста

2. извините за поздний ответ. это будет работать так, как если бы вы хотели получить только те записи, из TableB которых не существует в TableA , в соответствии с AccountId (принадлежит TableB) и ID (относится к TableA)