2010-11-08 3 views
2

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

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

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 
+0

Является ли это домашнее задание? В этом случае будет создан пошаговой список полетов (f1 ID: 1, 3, 5, 7) (f2 IDs: 2, 4, 6, 8), это то, чего вы хотите достичь? – dooburt

+0

Нет, работа на дому Я изучаю sql самостоятельно, но я столкнулся с проблемой понимания этого вопроса, поэтому я поставил его здесь – NoviceToDotNet

ответ

3
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 с любым другим номером здесь.

+0

Что должно быть чередующим, чем предлагать мне .. или написать запрос – NoviceToDotNet

+0

в вас abve query, что подсчет делает , не подсчитывает ли сумма нет, которые сгруппированы (полет No, flightDate) – NoviceToDotNet

+0

@NoviceToDotNet: да. – Quassnoi

1

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

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 
Смежные вопросы