С чего начать?
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, так
- нет никакого контекста, следует ли это быть правильным или неправильным
- запрос не будет работать даже
По крайней мере, попытайтесь опубликовать рабочий запрос, поскольку, похоже, он работает (и возвращает 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);
это SQL недопустим: * Vehical_Registration_No <> fk2_Vehical_Registration_No не в (...) * обязательно выдаст ошибку. Кроме того, вы используете агрегатную функцию без 'GROUP BY', которая является незаконной почти в каждой СУБД, кроме MySQL, что может привести к непоследовательным результатам. См. Эту ссылку для получения дополнительной информации: http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html –
Вы не должны использовать «старый, унаследованный стиль» JOIN, как этот 'from van, van_booking '- вместо этого« обновить »свой ум до явных синтаксисов JOIN, определенных в стандарте ANSI SQL:' INNER JOIN', 'LEFT OUTER JOIN',' CROSS JOIN' и т. д. Они стандартные, они гораздо понятнее читать и понимать - только преимущества! –
@ Kumu, я согласен с @Sarfraz, если вы не принимаете ответы людей, тогда у них не будет достаточного мотива для ответа на ваши вопросы. Так работает StackOverflow. Вы помогаете людям и ожидаете очков взамен (голосов и принимайте). Я уважаю тех, кто помогает, не ожидая чего-то взамен, но это, к сожалению, редко! – Rafid