отрицательный выбор SQL-запроса - PullRequest
8 голосов
/ 24 июня 2010

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

бизнес-таблица

[имя шины] [идентификатор шины]

таблица активности

[идентификатор активности] [идентификатор шины]

Таблица расширений операций

[Ext ID] [Идентификатор активности] [Идентификатор шины]

Мне нужны названия компаний для всех предприятий, у которых нет записи с идентификатором этого предприятия в связанных таблицах.,Проще говоря, все предприятия без деятельности.Бизнес-идентификатор может присутствовать в одной или обеих связанных таблицах.

Это вызывало у меня проблемы в течение нескольких часов, когда я пытался создавать запросы с объединениями, а не существовать или не существовать в выражениях.Нет успеха

Есть идеи?

Ответы [ 3 ]

24 голосов
/ 24 июня 2010

Использование NOT IN


SELECT b.*
  FROM BUSINESS b
 WHERE b.business_id NOT IN (SELECT a.business_id
                               FROM ACTIVITY a)
   AND b.business_id NOT IN (SELECT ae.business_id
                               FROM ACTIVITY_EXTENSION ae)

Использование NOT EXISTS


SELECT b.*
  FROM BUSINESS b
 WHERE NOT EXISTS (SELECT NULL 
                     FROM ACTIVITY a
                    WHERE a.business_id = b.business_id)
   AND NOT EXISTS (SELECT NULL 
                     FROM ACTIVITY_EXTENSION ae
                    WHERE ae.business_id = b.business_id)

Использование LEFT JOIN/IS NULL


   SELECT b.*
     FROM BUSINESS b
LEFT JOIN ACTIVITY a ON a.business_id = b.business_id
LEFT JOIN ACTIVITY_EXTENSION ae ON ae.business_id = b.business_id
    WHERE a.business_id IS NULL
      AND ae.business_id IS NULL

Заключение


Поскольку отношение является внешним ключом (business_id), можно с уверенностью предположить, что ни один из них не будет нулевым. В этом случае NOT IN и NOT EXISTS являются наилучшим средством поиска пропущенных значений в SQL Server. LEFT JOIN / IS NULL менее эффективны - подробнее об этом вы можете прочитать в этой статье .

5 голосов
/ 24 июня 2010

SELECT * FROM businesses WHERE business.id NOT IN (SELECT DISTINCT business_id FROM activities)

1 голос
/ 24 июня 2010

Я бы использовал комбинацию левого соединения и объединения, что-то вроде:

select * from Business b left join (select id, bid from Activity union select id, bid from ActivityExtension) a on b.id=a.bid where a.bid=null 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...