2015-12-11 2 views
3

Выполняя то, что я считал довольно обычной задачей для поиска записей в одной таблице, которых нет в другой таблице, я начал работать следующим образом. Примечание: общее значение имеет тип float в одной таблице (таким образом, литой) и varchar (20) в другой. MEMID = float, DMID = varchar.SQL - записи не в другой таблице

select cast((convert(int, MEMID)) as varchar(20)) 
from tempProv111315 
where cast((convert(int, MEMID)) as varchar(20)) NOT IN (
    SELECT DMID 
    FROM tempMemberMaster121015 
) 

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

select cast((convert(int, pv.MEMID)) as varchar(20)) 
from tempProv111315 pv 
left outer join tempMemberMaster121015 mm on 
    cast((convert(int, pv.MEMID)) as varchar(20)) = mm.dmid 
where mm.dmid is null 

Хотя, вероятно, простая причина, для жизни меня не видно, почему первый способ не сработал. Я не дБА, но часто использовал оба способа в разных обстоятельствах, поэтому я действительно хочу понять, чего не хватает. Может ли кто-нибудь объяснить разные результаты, поскольку они кажется логически равным мне.

ps - Я знаком с несколькими способами отбрасывания поплавка. Это мой типичный метод. Я не думаю, что это проблема ... но если да, то почему это работает хорошо во втором заявлении?

Спасибо!

+2

Возможно полезное чтение: [NOT IN vs. NOT EXISTS vs. LEFT JOIN/IS NULL: SQL Server] (http://explainextended.com/2009/09/15/not-in-vs-not-exists- vs-left-join-is-null-sql-server /) – AHiggins

ответ

4

Его известное поведение, ваш запрос будет возвращен NULL, что приведет к ошибке not in. Более подробную информацию можно найти here

NOT IN 
(
    SELECT DMID -- check whether this returns any NULL value 
    FROM tempMemberMaster121015 
) 

Я предлагаю вам использовать NOT EXIST вместо Left Outer Join

+0

Правильно, в возврате есть единственный нуль. В сочетании с «полезным чтением» AHiggins, приведенным выше в комментарии, теперь я получаю его. Ваше предложение использовать «не существует» является подходящим и тем, что я намереваюсь сделать. Спасибо за ваше время. – puddleglum

1

Вы можете использовать EXCEPT запрос в SQL Server для возврата отдельных строк из результатов одного запроса, которые не в результаты второго запроса.

синтаксис:

{ <query_specification> | (<query_expression>) } 
EXCEPT 
{ <query_specification> | (<query_expression>) } 

Пример использования таблиц/запросы в вашем вопросе:

SELECT CAST((CONVERT(INT, MEMID)) AS VARCHAR(20)) from tempProv111315 
EXCEPT 
SELECT DMID FROM tempMemberMaster121015 

Примечание: для других систем баз данных: В Oracle ключевое слово MINUS вместо КРОМЕ. В MySQL нет оператора EXCEPT, и я не думаю, что PostgreSQL тоже. Однако в Gokhan Atil есть сообщение, описывающее how to implement the behavior of EXCEPT, что, кстати, совпадает с запросом LEFT OUTER JOIN, с которым вы нашли успех в своем вопросе.

+0

Очень приятно! Я просто попробовал это, и он прекрасно работает. MM93 полностью ответил на вопрос, но это может быть так, как я иду, если не найду недостаток. спасибо за большое предложение. – puddleglum

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