TableA Left Join (подмножество) Таблица B - PullRequest
3 голосов
/ 10 июня 2009

Я хочу оставить присоединение TableA к TableB, где определенное условие в таблицеA истинно Поэтому я делаю этот тип SQL-запроса

Select * from
TableA Left Join TableB on TableA.fld1 = TableB.fld2
where TableA.fld3 = True

Это работает нормально. Теперь, однако, я хочу сделать соединение только с определенными записями в таблице B, т.е. в таблице B, где выполняется определенное условие, в частности fld4 имеет false в качестве значения. Причина, по которой я хочу это сделать, заключается в том, что я хочу знать, какие строки в таблице A не имеют совпадений в таблице B среди строк в таблице B, где fld4 равно false .

Если бы мне пришлось удалить все строки в Таблице B, где fld4 равно true и выполнить приведенный выше запрос Я бы получил правильный результат. Все, что мне нужно сделать, это найти строки в результирующем наборе записей с нулем в некоторой ячейке. Но если вместо того, чтобы сначала удалить строки из TableB, я изменю запрос на приведенный ниже, я не получу ни одной строки вообще

Select * from
TableA Left Join TableB on TableA.fld1 = TableB.fld2
where TableA.fld3 = True
and TableB.fld4 = false

Если мои разговоры имеют смысл, может кто-нибудь сказать мне, что я делаю не так? Спасибо

Ответы [ 3 ]

8 голосов
/ 10 июня 2009

Вы должны поставить условие в предложении соединения. Если у вас есть предложение where, которое фильтрует строки в правой части запроса на объединение влево, вы в конечном итоге исключаете строки. Попробуйте это:

Select * 
from   TableA 
       Left Join TableB 
         on TableA.fld1 = TableB.fld2 
         and TableB.fld4 = false
where  TableA.fld3 = True 
6 голосов
/ 10 июня 2009

Поместите это в предложение объединения:

select * from TableA 
left join TableB 
  on TableA.fld1 = TableB.fld2 
 and TableB.fld4 = False
where TableA.fld3 = True

Редактировать: ах, я пропустил это:

Я хочу знать, какие строки в таблицеA не имеют совпадений в таблицеB среди строк в таблицеB, где fld4 имеет значение false.

Запрос Джоэла будет работать, но, поскольку вас не интересуют какие-либо строки из TableB, коррелированный подзапрос может быть чище:

select * from TableA
where TableA.fld3 = True 
  and not exists (
    select * from TableB
    where TableA.fld1 = TableB.fld2
      and TableB.fld4 = False
    )
4 голосов
/ 10 июня 2009

Я хочу знать, какие строки в таблицеA не имеют совпадений в таблицеB среди строк в таблицеB, где fld4 имеет значение false.

Тогда вы хотите сделать это:

SELECT * 
FROM TableA
LEFT JOIN TableB on TableA.fld1 = TableB.fld2 AND TableB.fld4 = False
WHERE TableA.fld3 = True
    AND TableB.fld4 IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...