2016-02-29 2 views
4

Я делаю это:Как использовать не Равно в Postgresql присоединяется

select * from schema2."Student" a INNER JOIN  
schema1."StudentMapping" b on (a."StudentID" = b."StudentID") 
where a."IsRemoved" = false AND b."IsRemoved" = false 

получить только те записи из таблицы Student, которые присутствуют в StudentMapping таблицы, здесь IsRemoved колонка я использую для мягкого удаления (т.е. когда всякая запись должна быть удалена из любой из этих таблиц, тогда я устанавливаю ее только на true, поэтому для IsRemoved = false записей присутствуют в таблицах), и запрос работает нормально. Теперь то, что я хотел, чтобы получить все эти записи из Student таблицы, которые не присутствуют в StudentMapping таблице, поэтому я попытался это:

select * from schema2."Student" a INNER JOIN  
schema1."StudentMapping" b on (a."StudentId" != b."StudentId") 
where a."IsRemoved" = false AND 
b."IsRemoved" = false 

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

+0

Помимо: крайне редко, что вам действительно нужно сделать '= false' или '= true' на любом строго типизированном языке. Всегда просто просто использовать логическое значение: '! A." IsRemoved "AND! B." IsRemoved ". Кроме того, рассмотрите возможность устранения смешанного случая и цитирования при создании таблицы: 'is_removed' вместо' 'IsRemoved ''. Эти обложки и кавычки всегда будут для всех хлопот. (В отличие от [некоторых баз данных] (https://www.oracle.com/database/index.html), PG имеет * много * места для более длинных, более четких имен.) – jpmc26

ответ

1

сделать LEFT OUTER JOIN, а затем в пункте where, указать, чтобы показывать только recods где инфу привело к NULL:

select * from schema1."Student" a LEFT OUTER JOIN  
schema1."StudentMapping" b on (a."StudentID" = b."StudentID") 
where a."IsRemoved" = false 
and b.StudentID IS NULL 
+0

, давая пустой результат, я редактировал схемы вопросов для 2 таблицы разные – Aamir

+0

@ Aamir- попробуйте мое обновление – Lock

+0

его результаты, но есть одна проблема, см. В таблице Student. Здесь есть 982 строки, для которых «IsRemoved» = false и в моем первом запросе о получении записей из таблицы Student, которые присутствует в таблице StudentMapping. Я получаю результат как 4 строки, что тоже правильно, поэтому при запуске ur-запроса для несовпадения результатов я должен получить 982-4 = 978 записей, но я получаю 927 строк при выполнении вашего запроса и который я думаю, что это неправильно – Aamir