Объяснение запроса к БД - PullRequest
2 голосов
/ 08 ноября 2010

Я не могу понять, как следующий запрос приносит соответствующий результат, пожалуйста, объясните мне это

Рассмотрим следующую схему отношений для базы данных авиакомпаний.

customer(id, name, age, gender)
onFlight(id, flightNo, flightDate)
flightInfo(flightNo, fromCity, toCity, startTime, duration

. Рейсы (flightNo, flightDate), на которых есть минимум два клиента

SELECT f1.flightNo, f1.flightDate
FROM onFlight as f1, onFlight as f2
WHERE f1.flightNo = f2.flightNo AND f1.flightDate=f2.flightDate AND __________________ f1.id <> f2.id

Могу ли я написать этот запрос вместо ...

select flightNo, flightDate count(id) from onFlight groupBy(id) having count(id)>1

Ответы [ 2 ]

3 голосов
/ 08 ноября 2010
SELECT  f1.flightNo, f1.flightDate
FROM    onFlight as f1, onFlight as f2
WHERE   f1.flightNo = f2.flightNo
        AND f1.flightDate = f2.flightDate
        AND f1.id <> f2.id

Создает перекрестные соединения (все возможные комбинации) всех рейсов для каждой возможной пары flightNo / flightDate, выбираются все несоответствующие записи.

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

Более эффективный способ будет:

SELECT  flightNo, flightDate
FROM    onFlight
GROUP BY
        flightNo, flightDate
HAVING  COUNT(*) >= 2

Вы можете заменить 2 любым другим номером здесь.

1 голос
/ 08 ноября 2010

Это может быть более эффективным:

SELECT f1.flightNo, f1.flightDate, COUNT(*)
FROM onFlight AS f1, onFlight AS f2
WHERE f1.flightNo = f2.flightNo AND f1.flightDate=f2.flightDate 
GROUP BY f1.flightNo, f1.flightDate
HAVING COUNT(*)>=2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...