2016-12-13 3 views
2

В настоящее время я просматриваю примеры операторов EXISTS на http://www.w3resource.com/sql/special-operators/sql_exists.php# и сталкивался с примером, который не имеет никакого смысла. Код выглядит следующим образом:Оператор SQL EXISTS с GROUP BY

SELECT cust_code,cust_name,cust_city,grade 
FROM customer 
WHERE grade=2 AND 
    EXISTS( 
     SELECT COUNT(*) 
     FROM customer 
     WHERE grade=2 
     GROUP BY grade 
     HAVING COUNT(*)>2 
    ); 

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

Может кто-нибудь объяснить, что код пытается достичь здесь, пожалуйста?

Большое спасибо!

+0

Подзапрос не вернет никаких результатов, если у вас <= 2 клиентов с оценкой = 2, поэтому не совсем всегда верно? – user3012759

+0

Это должно быть объяснено на веб-сайте w3resource. – McNets

+0

'... не относится к таблице клиентов выше. Вы правы. Хотя это верно, пример ужасен, ИМО. – joop

ответ

1

Этот код проверяет, что есть по крайней мере две записей на customer таблице с grade = 2, если нет, то запись будет отфильтрована.

2

EXISTS будет вычисляться false при количестве записей с grade=2 меньше или равно 2. проверки запросов, если есть более двух записей с grade=2. Если есть столбцы шоу, упомянутые во внешнем select.

+0

Правильно, запрос показывает всех клиентов со степенью = 2, если они есть не менее трех таких клиентов, и ни один другой. –

0

Второй суб-запрос работает первыми получать все строки в таблице клиентов, где ранг равен 2.

SELECT COUNT(*) 
FROM customer 
WHERE grade=2 

В следующем разделе ниже запроса. Группируйте все эти строки вместе по классам.

GROUP BY grade 

Наконец, код счетчика, приведенный ниже, исключает любую из групп, у которых не менее двух элементов.

HAVING COUNT(*)>2 

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

0

класс = 2 И
EXISTS (
SELECT COUNT () от клиента
ГДЕ класс = 2
GROUP BY класса
HAVING COUNT (
)> 2 );

TRUE and TRUE =TRUE 

Так ваши чеки запроса, если класс = 2, и есть по крайней мере один ряд с ниже условия

WHERE grade=2 
     GROUP BY grade 
     HAVING COUNT(*)>2 

Если оба условия не отвечают соответствующим требованиям, ваш запрос не возвращает никакого результирующего набора