2014-10-14 3 views
0

В SQL Server 2014 ...SQL-запрос: выбрать в с джойна на 2 колонки

Я пытаюсь найти строки в таблице «новый», которые не существуют в таблице «старой». Я хочу взять эти новые строки и внести их в третью таблицу, которую я создаю. Таблица «new» имеет первичный ключ, состоящий из двух столбцов: MakeId и ModelId. Следующий SQL работает, но дает мне слишком много строк. Очевидно, что я делаю что-то неправильно.

select 
    new.MakeId  , 
    new.MageMakeId , 
    new.ModelId , 
    new.MageModelId 
into BiUpdater..TranslateModel 
from Mage_Production..TranslateModel new 
    left outer join BiLoader..TranslateModel old0 on new.MakeId = old0.MakeId 
    left outer join BiLoader..TranslateModel old1 on new.ModelId = old1.ModelId 
go 
+0

Вам нужен 'где от старого является null'. В противном случае вы получите все от нового. – Andrew

+1

Я понимаю, что ваш вопрос немного неоднозначен. Примеры данных и желаемые результаты всегда полезны. –

ответ

2

Я предполагаю, что вы хотите только один присоединиться, используя обе колонки:

select new.MakeId, new.MageMakeId, new.ModelId, new.MageModelId 
into BiUpdater..TranslateModel 
from Mage_Production..TranslateModel new left outer join 
    BiLoader..TranslateModel old 
    on new.MakeId = old.MakeId and new.ModelId = old.ModelId 
where old.MakeId is null; 

Что еще более важно, хотя, вам нужно условие where, чтобы получить не-матчи.

EDIT:

Если вы ищете строки, которые не соответствуют ни MakeId или ModelId, то, возможно, это действительно то, что вы хотите:

select new.MakeId, new.MageMakeId, new.ModelId, new.MageModelId 
into BiUpdater..TranslateModel 
from Mage_Production..TranslateModel new left outer join 
    BiLoader..TranslateModel old1 
    on new.MakeId = old1.MakeId left join 
    BiLoader..TranslateModel old2 
    on new.ModelId = old2.ModelId 
where old1.MakeId is null and old2.ModelId is null; 

Вы можете в or вместо and , в этом случае используйте select distinct.

+0

Сладкий! Только то, что мне нужно! Я использовал первый пример. Иногда человек идет по неправильному пути, и вам нужно немного поправлять вещи. – user2300311

0

Существует инструкция SQL, называемая EXCEPT, которая делает это. вот ссылка: http://msdn.microsoft.com/en-us/library/ms188055.aspx

Ваш правый стол будет «новым», а ваш левый стол будет «старым».

select * 
into BiUpdater..TranslateModel 
from (
select new.* 
from Mage_Production..TranslateModel new 

EXCEPT 

select old.* 
from BiLoader..TranslateModel old 
) 

В качестве альтернативы можно использовать LEFT JOIN, чтобы сделать это:

select new.* 
into BiUpdater..TranslateModel 
from Mage_Production..TranslateModel new left join BiLoader..TranslateModel old 
on new.MakeId = old.MakeId and new.ModelId = old.ModelId 
where old.MakeId is null 
Смежные вопросы