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