2011-01-16 4 views
0

Здравствуйте, у меня возникла проблема с моим запросом, и он отображает правильные данные, но не правильную сумму (count (*)). Как-то он должен отображать данные как 1 для этой части, но он отображает 4. Я не знаю, где ошибка.SQL Count (*) не отображает правильные данные

 
select Vehical_Type, 
     Vehical_Registration_No, 
     count(*) 
from van, 
    van_booking 
where Vehical_Type = 'Ford - Transit' 
    and Vehical_Registration_No <> fk2_Vehical_Registration_No 
     not in (select fk2_Vehical_Registration_No 
       from van_booking 
       where '2010.10.12' between Hire_Start_Date and Hire_End_Date 
        or '2010.10.11' between Hire_Start_Date and Hire_End_Date); 

Возможно, кто-нибудь может мне помочь?

+0

это SQL недопустим: * Vehical_Registration_No <> fk2_Vehical_Registration_No не в (...) * обязательно выдаст ошибку. Кроме того, вы используете агрегатную функцию без 'GROUP BY', которая является незаконной почти в каждой СУБД, кроме MySQL, что может привести к непоследовательным результатам. См. Эту ссылку для получения дополнительной информации: http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html –

+1

Вы не должны использовать «старый, унаследованный стиль» JOIN, как этот 'from van, van_booking '- вместо этого« обновить »свой ум до явных синтаксисов JOIN, определенных в стандарте ANSI SQL:' INNER JOIN', 'LEFT OUTER JOIN',' CROSS JOIN' и т. д. Они стандартные, они гораздо понятнее читать и понимать - только преимущества! –

+1

@ Kumu, я согласен с @Sarfraz, если вы не принимаете ответы людей, тогда у них не будет достаточного мотива для ответа на ваши вопросы. Так работает StackOverflow. Вы помогаете людям и ожидаете очков взамен (голосов и принимайте). Я уважаю тех, кто помогает, не ожидая чего-то взамен, но это, к сожалению, редко! – Rafid

ответ

2

С чего начать?

select Vehical_Type, Vehical_Registration_No, count(*) 
from van, van_booking 
where Vehical_Type = 'Ford - Transit' 
    and Vehical_Registration_No <> fk2_Vehical_Registration_No 
**not in (** 
    select fk2_Vehical_Registration_No 
    from van_booking 
    where '2010.10.12' between Hire_Start_Date and Hire_End_Date 
    or '2010.10.11' between Hire_Start_Date and Hire_End_Date); 

Поскольку нет «и» до того, как NOT IN, так

  1. нет никакого контекста, следует ли это быть правильным или неправильным
  2. запрос не будет работать даже

По крайней мере, попытайтесь опубликовать рабочий запрос, поскольку, похоже, он работает (и возвращает count => 4).

Во-вторых, пожалуйста, псевдоним имен таблиц, чтобы вы могли префикс столбцов с именами псевдонимов. В настоящее время неоднозначно, какие столбцы относятся к тем таблицам.

В-третьих, я думаю, что это MySQL? Вы всегда должны указывать, с какой СУБД вы работаете, но MySQL является единственным, что позволит вам уйти с MIXING агрегированные и неагрегатные поля БЕЗ предложение GROUP BY.

В-четвертых, попробуйте научиться использовать соединения SQL92 ANSI вместо перекрестного соединения старого типа и фильтра-в-ГДЕ. Похоже, вы перешли таблицы Van и Van_Booking без какой-либо корреляционной оговорки. Чего вы пытаетесь достичь?

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

Я собираюсь угадать, что то, что вы на самом деле после этого, является списком регистрационных номеров транспортного средства запрашиваемого типа, но в то же время в столбце COUNT покажите ... общее количество записей, соответствующих запросу ? Итак, что-то вроде этого?

Type | Registration | Count 
Ford - Transit | ABC123 | 4 
Ford - Transit | D4 | 4 
Ford - Transit | XY13 | 4 
Ford - Transit | PQS333 | 4 

Это только предположение, но без подсчета, вы можете использовать этот

select Vehical_Type, Vehical_Registration_No 
from van 
where Vehical_Type = 'Ford - Transit' 
    and Vehical_Registration_No not in (
    select fk2_Vehical_Registration_No 
    from van_booking 
    where '2010.10.12' between Hire_Start_Date and Hire_End_Date 
    or '2010.10.11' between Hire_Start_Date and Hire_End_Date); 

Чтобы включить счетчик (который будет иметь то же значение во всех строках), вы можете продублировать запрос как подзапрос к себе

select Vehical_Type, Vehical_Registration_No, C.C 
from van 
cross join (
    select COUNT(*) C 
    from van 
    where Vehical_Type = 'Ford - Transit' 
     and Vehical_Registration_No not in (
     select fk2_Vehical_Registration_No 
     from van_booking 
     where '2010.10.12' between Hire_Start_Date and Hire_End_Date 
     or '2010.10.11' between Hire_Start_Date and Hire_End_Date)) C 
where Vehical_Type = 'Ford - Transit' 
    and Vehical_Registration_No not in (
    select fk2_Vehical_Registration_No 
    from van_booking 
    where '2010.10.12' between Hire_Start_Date and Hire_End_Date 
    or '2010.10.11' between Hire_Start_Date and Hire_End_Date); 
+0

Благодарим за помощь. Я попытался использовать ваш запрос, и он сработал. Мне понравятся ваши предложения, и я постараюсь сделать их все. – Leo

3

count (*) Обратите внимание, что будет отображаться в том числе подсчет NULLS, где, как count(fieledName) будет отображать количество безNULLS. Вы должны пойти с соответствующим вариантом.

+0

Это прямое внутреннее соединение, и, похоже, нет какого-либо поля, которое учитывается конкретно. – RichardTheKiwi

3

Предполагая, что ваша СУБД допускает отсутствие GROUP BY, а недопустимое выражение с NOT IN - это всего лишь копия & Вставить ошибку, я бы сказал, что ваша проблема - это отсутствие соединения.

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

Я предполагаю, что вы хотите что-то вроде:

 
FROM van 
    JOIN van_booking ON van.id = van_booking.van_id 

Чтобы правильно соединить эти две таблицы.

+1

+1 для использования правильного синтаксиса ANSI SQL-92 JOIN! Именно так должно быть всегда ... –

+0

Благодарим за помощь, и я попытался использовать следующий запрос. Тогда его работа и я узнаю о соединениях и попытаюсь их использовать. Тогда я могу избавиться от Декартовых продуктов. – Leo

Смежные вопросы