0

なぜこれほど多くのレコードを取得しているのか

SELECT e.OneColumn, fb.OtherColumn
FROM  dbo.TABLEA FB
INNER JOIN dbo.TABLEB eo ON Fb.Primary = eo.foregin
INNER JOIN dbo.TABLEC e ON eo.Primary =e.Foreign
WHERE FB.SomeOtherColumn = 0

これを実行すると、何百万ものレコードが取得されますが、これは正しくありません。すべてのテーブルのレコード数が少なくなります。

TableA と TableC から列を取得する必要があります。これらは論理的に結合されていないため、ブリッジとして機能するために TableB を使用する必要があります

編集

以下はカウントです。

TABLEA = 273551
TABLEB = 384412
TABKEC = 13046

上記のクエリ = 2 分後、クエリを強制的にキャンセルしました..それまでのカウントは11437613 でした

なにか提案を?

4

1 に答える 1

1

結果が期待どおりでないようなクエリで何が起こっているのかを理解するために、私はこれを行う傾向があります。最初に SELECT * に変更します (これは問題を把握するためだけのものです。本番環境で SELECT * を使用しないでください!) 次に、クエリにない場合は、tableA からの ID フィールドの order by を追加します。

そのため、最初のテーブルからの where 条件を含めて、最初のテーブルまでクエリを実行します。残りはコメントアウトします。返されたレコードの数に注意してください。

次に、2 番目のテーブルとそこからの条件を追加します。1 対 1 の関係を期待していて、このクエリが少ない数のレコードを返さない場合は、返されたデータを調べて、その理由を突き止められるかどうかを確認します。コンテンツは table1 ID によって順序付けられているため、通常、重複しているいくつかのレコードの例を簡単に確認してから、違いの原因となっているフィールドが見つかるまでスクロールできます。多くの場合、これは、次のテーブルのフィールドに追加の where 句または集計を追加して、1 つのレコードのみに制限する必要があることを意味します。ただし、次の結合でより効果的に変更できる可能性があるため、この時点で問題を書き留めておいてください。

したがって、レコードの数ではなく、3 番目のテーブルに再度追加し、A の ID が繰り返されるデータを詳しく調べます。返す予定の列を見てください。ID は常に同じですか? それらが異なる場合は、1 対 1 の関係ではなく、データの整合性の問題であるか、1 対 1 であると誤解していることを理解する必要があります。これらが同じ場合は、派生テーブルが適切である可能性があります。tableb からの ID のみが必要なので、結合は次のようになります。

JOIN (SELECT MIn(Primary), foreign FROM TABLEB GROUP BY foreign) EO ON Fb.Primary = eo.foreign  

お役に立てれば。

于 2012-10-17T15:22:20.603 に答える