MySQL Join Where Not Exists

Вероятно, несколько синтаксических ошибок в этом, потому что я пишу с мобильного, но это должно помочь вам начать

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);
                  }
        }
    )
}
68
задан Andy White 15 April 2009 в 04:48
поделиться

2 ответа

Я бы, вероятно, использовал левое соединение, которое будет возвращать строки, даже если совпадений нет , а затем вы можете выбрать только строки без соответствия, проверив NULL.

Итак, что-то вроде:

SELECT V.*
FROM voter V LEFT JOIN elimination E ON V.id = E.voter_id
WHERE E.voter_id IS NULL

То, будет ли это более или менее эффективным, чем использование подзапроса, зависит от оптимизации, индексов, возможно ли иметь больше одно исключение на каждого избирателя и т. д.

161
ответ дан Kaii 24 November 2019 в 14:08
поделиться

Я бы использовал «там, где не существует» - точно так, как вы предлагаете в своем заголовке:

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.

5
ответ дан 24 November 2019 в 14:08
поделиться
Другие вопросы по тегам:

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