отрицательный SQL-запрос выбора

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

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

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

Таблица действия

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

Раздвижной стол действия

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

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

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

Какие-либо идеи?

8
задан CharlesB 4 May 2012 в 23:43
поделиться

3 ответа

Использование 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)

Использование НЕ СУЩЕСТВУЕТ


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 менее эффективен - вы можете прочитать больше об этом в этой статье.

25
ответ дан 5 December 2019 в 05:25
поделиться

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

5
ответ дан 5 December 2019 в 05:25
поделиться

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

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 
1
ответ дан 5 December 2019 в 05:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: