0

今日、複数テーブルのクエリで問題が発生しました。自分で書いてみましたがうまくいかないようだったので、Management Studio のデザイン ビューですべての列を選択しました。コードは機能する必要がありますが、残念ながら機能しません。このクエリを実行すると、ずっと進んでいるように見えます。1 分間デスクを離れ、戻ってクエリを停止したところ、2,000,000 行ほどが返されていました (PODetail テーブルには約 120,000 行しかありません!!)。

SELECT     PODetail.OrderNum, PODetail.VendorNum, vw_orderHistory.Weight, vw_orderHistory.StdSqft, vw_orderHistory.ReqDate, vw_orderHistory.City, 
                  vw_orderHistory.State, FB_FreightVend.Miles, FB_FreightVend.RateperLoad
FROM         PODetail CROSS JOIN
                  vw_orderHistory CROSS JOIN
                  FB_FreightVend
ORDER BY ReqDate

それだけでなく、すべてのレコードの OrderNum が 0 であるように見えますが、これはあってはならないことです。だから除外してみた…

SELECT     PODetail.OrderNum, PODetail.VendorNum, vw_orderHistory.Weight, vw_orderHistory.StdSqft, vw_orderHistory.ReqDate, vw_orderHistory.City, 
                  vw_orderHistory.State, FB_FreightVend.Miles, FB_FreightVend.RateperLoad
FROM         PODetail CROSS JOIN
                  vw_orderHistory CROSS JOIN
                  FB_FreightVend
WHERE PODetail.OrderNum <> 0
ORDER BY ReqDate

正常に実行されますが (エラーは発生しません)、レコードはまったく返されません。何が起きてる?クエリの CROSS JOIN も気になります。これを自分で書いてみたとき、最初に「WHERE PODetail.OrderNum = vw_orderHistory.OrderNum」を使用してこれらのテーブルを結合しましたが、同じ結果の問題が発生しませんでした。JOIN を使用しようとすると、「マルチパート識別子をバインドできませんでした」というエラーが発生しました。

4

3 に答える 3

3

Across joinは無数のレコードを返します。各テーブルのレコード数の積。. . それは 10,000 * 100,000 * 100 になるかもしれません。これは大きな数字です。

1 つの注意点は、テーブルが空の場合です。次に、そのテーブルの行は 0 です。. . 0 回はすべて 0 です。そのため、行は返されません。また、すぐに返される行はありません。

SQLで実際に何をするかを学ぶ必要があると思いますjoin。次に、正しい結合条件でこれを再実装する必要があります。クエリの実行が速くなるだけでなく、正確な結果が返されます。

于 2013-07-22T13:53:05.003 に答える
1

特に大きなテーブルではクロス結合を使用しないでください。以下のリンクが役立ちます。

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

また、マルチパート識別子をバインドできませんでした。列が定義どおりに存在しない可能性があることを意味します。列が存在すること、データ型、および結合に割り当てられた名前を確認します。

条件 <> 0 では、PODetail からの対応しない値はすべて省略されます。使用 (Ordernumber <> 0 または Ordernumber が null)

于 2013-07-22T18:48:13.823 に答える