2012-02-22 3 views
1

Я пытался написать запрос с внутренним соединением, только если RepID таблицы 1 существует в таблице2, если не присоединиться к таблице2. С запросом, который я использовал ниже, я не получаю от обеих таблиц, если repID не существует в таблице2. Как это возможно? Я использую sql server 2005. Спасибо заранее!Внутреннее соединение с условием if

Select * from Table1 
inner join Table2 on Table1.RepID = Table2.RepID 
where Table1.Date = @Date 
order by Table1.Date desc 
+0

Вы имеете в виду, если repID is NULL? – Luke101

+0

'SELECT * FROM Table1' должно быть очевидно, что в результате ничего из' Table2' не будет получено, что вызывает вопрос: почему вы думаете, что хотите присоединиться к 'Table2' вообще? Предложение: напишите два запроса, по одному для каждого условия ('REPID' существует в обеих таблицах,' REPID' существует только в 'Table1'), а затем' UNION 'их вместе, при необходимости предоставляя одобренные DBA значения по умолчанию для любых отсутствующих значений. – onedaywhen

ответ

2

Внутреннее соединение будет возвращать строку только в том случае, если совпадения найдены по обеим сторонам соединения. Если вы ищете что-то, что будет возвращать все строки из Table1, но только записи из Table2 когда найдено совпадение, вы хотите, левое внешнее соединение:

select * from Table1 as t1 
left outer join Table2 as t2 
    on t1.RepID = t2.RepID 
where t1.Date = @Date 
order by t1.Date desc 
+0

Спасибо, Джастин! Очень хорошее объяснение. Я уверен, что не забуду это снова! – Ram

+0

Ваш запрос вернет все строки из таблицы «Таблица1», не будет строк из «Таблица2», и если на «правой» стороне будет найдено несколько совпадений, то строка на стороне слева будет дублирована. Пожалуйста, объясните мне, как такой запрос полезен. – onedaywhen

+0

@onedaywhen когда у меня не более одной строки на обеих таблицах с помощью RepID. Есть ли что-то, что я еще не пропустил, пожалуйста, дайте мне знать. :-) – Ram

0

похоже, что вы действительно хотите, это левое внешнее соединение, не так ли?

+0

Правильно, спасибо! – Ram

2

Попробуйте "LEFT JOIN" вместо "INNER JOIN".

Слово «LEFT» означает «Всегда включать каждую запись из таблицы на LEFT соединения», в этом случае Table1, так как вы будете писать: Таблица 1 LEFT JOIN Table2 и «Table1» находятся слева от эта пара! :-)

+0

Я знаю, спасибо за помощь! :-) – Ram

+0

Можете ли вы догадаться, что делает ПРАВОЕ СОЕДИНЕНИЕ? ;-) ;-) ;-) –

+0

Да, я догадался! :-) – Ram

0
SELECT * 
    FROM Table1 
     LEFT JOIN Table2 
      ON Table1.RepID = Table2.RepID 
    WHERE Table1.Date = @Date 
    ORDER BY Table1.Date DESC; 
+0

Спасибо, Джо! полезно это .. – Ram

+0

Ваш запрос вернет повторяющиеся строки из 'Table1', если во внешней таблице есть несколько совпадающих строк. Вы можете исправить это, добавив 'DISTINCT' в предложение' SELECT', но лучше всего просто удалить соединение целиком. Что оставляет меня интересно, в чем смысл этого ответа? – onedaywhen

0

Это то, что объединяет внешний для.

Select * from Table1 
left outer join Table2 on Table1.RepID = Table2.RepID 
where Table1.Date = @Date 
order by Table1.Date desc 
+0

Спасибо за хедз-ап на внешние соединения! – Ram

Смежные вопросы