2011-08-12 19 views
0

私は3つのテーブルを持っています。母集団データテーブル、郡テーブル、および状態テーブルを含む。私は下のSQLを実行すると、私は不正な結果セットを取得します。 SQLはウィスコンシン州の55の郡を返します。私は州に72があることを知っています。 Countiesテーブルに行き、以下の1行のSELECT文を実行すると、72の郡が得られます。このSQLはなぜ不正な結果セットを返しますか?

私は同じ郡の倍数を取得していますが、母集団の詳細が異なるため、私は結合ステートメントの問題を示しています。私は、結合ステートメントのすべての組み合わせを試したと思うが、問題を解決することができませんでした。ジョインの1つの組み合わせを使用して、私は86の郡で返された結果セットにできました。それも間違っています。

ありがとうございます!

- 正しい郡を返します。 SELECT * FROM counties WHERE stateId = 'D14B7CD0-145F-4B84-9533-0BB3B2F5A5B5'

-- returns incorrect counties. 
SELECT this.POPULATION, this.LATITUDE, this.LONGITUDE, this.CountyId, st.NAME AS StateName, cty.Name AS CountyName 
FROM PopulationData AS this 
INNER JOIN Counties AS cty ON this.CountyId = cty.Id 
INNER JOIN States AS st ON cty.StateId = st.Id 
WHERE (st.Name = 'wisconsin') 
ORDER BY CountyName 
+1

データのサンプルと両方の結果セットが役立ちます。あなたは回答を与えるのに十分なデータを提供していません。 – Oded

+1

後者のクエリはさらに2つのテーブルを結合するので、いくつかの国(17)がpopulationDataまたはstatesテーブルに関係がないように見える – sll

+0

PopulationDataテーブルには各郡ごとに1つの行が含まれていますか? PopulationDataに対応する行がない郡がある場合、それらはクエリによって返されません。PopulationDataに複数の行を持つ郡がある場合、クエリ内に複数の行が返されます。 – JSR

答えて

1

あなたPopulationDataテーブル内のデータが正しいことを確認していますか?あなたが郡のマッピングに誤って人口を持っていると、あなたは悪評を受けるでしょう。

stateIdを使用して正しく動作する場合は、動作していないものではなくstateIdを使用してみてください。

2

後者のクエリはpopulationDataには関係がありませんまたはテーブル

はあなたが打破しなければならない問題のこのタイプの

SELECT 
     this.POPULATION, 
     this.LATITUDE, 
     this.LONGITUDE, 
     this.CountyId, 
     st.NAME AS StateName, 
     cty.Name AS CountyName 
FROM Counties AS cty 
LEFT JOIN PopulationData AS this ON this.CountyId = cty.Id 
LEFT JOIN States AS st ON cty.StateId = st.Id 
WHERE (st.Name IS NULL OR st.Name = 'wisconsin') 
ORDER BY CountyName 
1

を試してみてください述べ(17)テーブルには、ので、いくつかの国のように見える2以上が参加しますあなたの問題をより小さな部分に分けて、問題がどこにあるかを把握してください。

あなたのクエリは有効と思われるので、データと関連があります。

silevが示唆しているように左ジョインを使用してみて、次に内部ジョインに切り替えると、追加する制限によって問題が発生しています。

私の推測では、すべての郡のPopulationDataにデータはありません。 PopulationDataにデータがなくても列挙された郡を表示したい場合は、まずStateを設定し、Countで内部結合を行い、次にPopulationDataで左結合します。

1

結合できないテーブルのフィールドに、null値を持つ正しいcountyを返します。

SELECT this.POPULATION, this.LATITUDE, this.LONGITUDE, this.CountyId, st.NAME AS StateName, cty.Name AS CountyName 
FROM Counties AS cty 
LEFT JOIN States AS st ON this.CountyId = cty.Id 
LEFT JOIN PopulationData AS this ON cty.StateId = st.Id 
WHERE cty.stateId = 'D14B7CD0-145F-4B84-9533-0BB3B2F5A5B5' 
ORDER BY CountyName 
関連する問題