Вероятно, несколько синтаксических ошибок в этом, потому что я пишу с мобильного, но это должно помочь вам начать
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (!request.url.startsWith('/api')) {
return next.handle(request)
}
const cloned = request.clone()
return next.handle(request)
.do((event: HttpEvent<any>) =>
return from(this.sessionService.refresh())
.pipe(map(() => next.handle(cloned)))
}), (err: any) => {
if (err instanceof HttpResponse) {
if(err.status === 401){
return throwError(error);
}
}
)
}
Я бы, вероятно, использовал левое соединение, которое будет возвращать строки, даже если совпадений нет , а затем вы можете выбрать только строки без соответствия, проверив NULL.
Итак, что-то вроде:
SELECT V.*
FROM voter V LEFT JOIN elimination E ON V.id = E.voter_id
WHERE E.voter_id IS NULL
То, будет ли это более или менее эффективным, чем использование подзапроса, зависит от оптимизации, индексов, возможно ли иметь больше одно исключение на каждого избирателя и т. д.
Я бы использовал «там, где не существует» - точно так, как вы предлагаете в своем заголовке:
SELECT `voter`.`ID`, `voter`.`Last_Name`, `voter`.`First_Name`,
`voter`.`Middle_Name`, `voter`.`Age`, `voter`.`Sex`,
`voter`.`Party`, `voter`.`Demo`, `voter`.`PV`,
`household`.`Address`, `household`.`City`, `household`.`Zip`
FROM (`voter`)
JOIN `household` ON `voter`.`House_ID`=`household`.`id`
WHERE `CT` = '5'
AND `Precnum` = 'CTY3'
AND `Last_Name` LIKE '%Cumbee%'
AND `First_Name` LIKE '%John%'
AND NOT EXISTS (
SELECT * FROM `elimination`
WHERE `elimination`.`voter_id` = `voter`.`ID`
)
ORDER BY `Last_Name` ASC
LIMIT 30
Это может быть немного быстрее, чем выполнение левого соединения (конечно, в зависимости от вашего индексы, количество элементов ваших таблиц и т. д.), и почти наверняка намного быстрее, чем использование IN.