2010-01-21 6 views
3

Я хочу присоединиться к двум таблицам, но хочу, чтобы в результирующем наборе отображались только совпадения arent в правой части.Присоединяйтесь к таблицам SQL Server

Пример:

LeftTable

  • leftID | PK
  • стоимость |

RightTable

  • rightID | ПК
  • leftID | ФК

    выберите l.value

    от LeftTable л

    присоединиться к RightTable г

    на l.leftID = r.leftID

Я знаю, что это не будут давать мне то, что я хочу, но я просто пытаюсь выяснить, какие элементы в левой таблице не отображаются в правой части используя отношение внешнего ключа leftID.

Любые идеи?

ответ

11

Что делать, если мы делаем

select LT.value 
from LeftTable LT 
left outer join RightTable RT 
on LT.leftID = RT.leftID 
Where RT.leftId is null 

SO присоединиться будет возвращать все совпадения, а также те строки, которые находятся в левой, но не в порядке. С предложением where мы получаем только те строки, для которых правая таблица слева равна нулю.

+1

Считаете ли вы, что это хорошая практика, чтобы дать псевдонимы как ** RESERVED ** words? –

+0

Ну, мы никогда не должны использовать зарезервированные слова. Я перейду на псевдоним. –

0

select * from LeftTable where leftID not in (select leftID from RightTable)

5

Вы чуть это, только несколько незначительных изменений - объединение должно быть LEFT JOIN, а не [INNER] JOIN, и вы должны возвращать только строки, где правая таблица отсутствует , то есть его поле NULL:

SELECT T1.value 
FROM LeftTable T1 
LEFT JOIN RightTable T2 
ON T1.leftID = T2.leftID 
WHERE T2.leftID IS NULL 
+0

+1 - избили меня! – davek

+1

Считаете ли вы, что это хорошая практика, чтобы давать псевдонимы как ** RESERVED ** words? –

+0

Нет ... Я предполагаю, что имена таблиц были изменены для защиты невинных и что они фактически не являются именами, используемыми в производственной системе. Я, конечно, надеюсь, что так. Но я все равно изменю. –

0
SELECT LeftID 
FROM LeftTable 
    LEFT OUTER JOIN RightTable ON LeftTable.LeftID = RightTable.LeftID 
WHERE RightTable.RightId IS NULL 
0

альтернативное использование exists, как предпочтение к использованию where not in. left outer join с проверкой нулевого состояния права, вероятно, все же является оптимальным.

select 
     left.* 
    from 
     LeftTable as left 
    where 
     not exists (
      select 
        * 
       from 
        RightTable as right 
       where 
        right.RightID = left.LeftID 
      ) 
Смежные вопросы