2011-01-16 20 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); 

私を助けることができますか? count(fieledName)NULLSせず、カウントを表示するようcount (*)NULLS場合を含む数を表示すること

+0

。さらに、MySQLを除くほぼすべてのDBMSでは 'GROUP BY'を使わずに集計関数を使用しています。これは矛盾した結果を招く可能性があります。詳細については、次のリンクを参照してください。http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html –

+1

「古い、旧式の」JOINをこのように使用しないでください。from van、van_booking ' - 代わりに、ANSI SQL標準で定義されているような明示的なJOIN構文、つまり「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); 

それが正しいか間違っているか否かの何のコンテキストがありませんので、

  1. ない「AND」の前にNOT IN、存在しないので
  2. クエリも
  3. を実行しません。

少なくとも、稼働中のクエリを投稿しようとすると、動作していると思われます(カウント= 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); 
+0

助けていただきありがとうございます。私はあなたの質問を使用しようとしました、それは働いた。私はあなたの提案が欲しいと私はそれらをすべてやろうとします。 – Leo

3

は注意してください。適切なオプションを選択してください。

+0

これはストレートな内部結合であり、特にカウントされるフィールドはないようです。 – RichardTheKiwi

3

あなたのDBMSがGROUP BYの不在を許し、NOT INの無効な式がコピー&のコピーであるとすれば、問題は欠落していると言えます。

vanvan_bookingには参加しないので、ステートメントはこれらのテーブルのデカルト積を生成します。意味vanにはからすべてvan_bookingに接続されています。これはおそらくあなたが望むものではありません。

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

が適切にこれらの2つのテーブルを結合するために:

は、私はあなたのような何かをしたいと思います。

+1

+1適切なANSI SQL-92 JOIN構文を使用してください!それは常にそうでなければならない方法です... –

+0

あなたの助けに感謝し、私は次のクエリを使用しようとしました。 それから、その作業と私は結合について学び、それらを使用しようとします。次に、私はデカルト積を取り除くことができます。 – Leo

関連する問題