どこから始めますか?
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);
それが正しいか間違っているか否かの何のコンテキストがありませんので、
- ない「AND」の前にNOT IN、存在しないので
- クエリも
を実行しません。
少なくとも、稼働中のクエリを投稿しようとすると、動作していると思われます(カウント= 4を返します)。
第2に、列の先頭にエイリアス名を付けることができるように、テーブル名のエイリアスを付けてください。現在、どの列がどの表に属しているかは曖昧です。
第3に、これはMySQLだと思いますか?どのDBMSを使用しているかは常に明記してください。集約集計フィールドと非集計フィールドWITHOUT GROUP BY句は、MySQLだけです。
第4に、古いスタイルのクロスジョインとWHEREフィルタではなく、SQL92 ANSIジョインを使用する方法を学びましょう。相関節なしでVanとVan_Bookingテーブルを越えたようです。あなたは何を達成しようとしていますか?
最後に、これは最後の点に関連して、いくつかのサンプルデータ行と、そのサンプルデータに基づいてどのような結果が表示されるかを大いに参考にします。
あなたが実際に何をしているのかは、要求されたタイプの車両登録番号のリストですが、同時にCOUNT列では、show ...クエリに一致するレコードの総数?だから、これは何か?
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);
を使用することができ、あなたのようにクエリを複製することができます* Vehical_Registration_No <> fk2_Vehical_Registration_Noない(...)で*は間違いなく、エラーをスローします:SQLが無効である自分自身へのサブクエリ
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);
。さらに、MySQLを除くほぼすべてのDBMSでは 'GROUP BY'を使わずに集計関数を使用しています。これは矛盾した結果を招く可能性があります。詳細については、次のリンクを参照してください。http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html –
「古い、旧式の」JOINをこのように使用しないでください。from van、van_booking ' - 代わりに、ANSI SQL標準で定義されているような明示的なJOIN構文、つまり「INNER JOIN」、「LEFT OUTER JOIN」、「CROSS JOIN」などを心に「アップグレード」します。彼らは標準であり、読んで理解するのがはるかに明確です。 –
@Kumu、@Sarfrazに同意します。あなたが人々の答えを受け入れないなら、あなたの質問に答える動機がありません。これは、StackOverflowの仕組みです。あなたは人々を助け、返品でポイントを期待します(投票&同意)。私は何かリターンを期待することなく、助けてくれる人を尊敬しますが、それは残念ながら稀です! – Rafid