Для меня определили задачу с возвратом отрицательного выбора от нашей sql базы данных. Я определю критерии как лучше всего, я могу. К настоящему времени я не обработал запрос, который работал.
[Название шины] [идентификатор шины]
[Идентификатор действия] [идентификатор шины]
[Идентификатор расширения] [идентификатор действия] [идентификатор шины]
Мне нужны Названия компании для всех компаний, которые не имеют записи с тем идентификатором компаний # в связанных таблицах. Проще говоря, все компании без операций. Бизнес-идентификатор может присутствовать в одном или обеих из связанных таблиц.
Это вызывало меня проблема в течение нескольких часов при попытке обработать запросы с соединениями и не существует или не в операторах. Никакой успех.
Какие-либо идеи?
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 менее эффективен - вы можете прочитать больше об этом в этой статье.
SELECT * FROM businesses WHERE business.id NOT IN (SELECT DISTINCT business_id FROM activities)
Я бы использовал комбинацию левого объединения и объединения, что-то вроде:
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