2

SQL Server の大規模なクエリに問題があり、期待どおりに実行されていないコードのこのセクションをたどりました。

SELECT item_name,item_num,rst_units
FROM tbl_item left join tbl_sales_regional on item_num=rst_item
WHERE rst_month=7 and rst_customer='AB123' 

最初のテーブル (tbl_item) には 10,000 レコードがあります。2 番目のテーブル (tbl_sales_regional) には、表示されている条件の 83 があります。

実行計画は、9,917 個の null を含む 10,000 レコードを返す代わりに、SQL Server が内部結合として書き直され、結果として 83 個の結果を返すことを示しています。

意図した結果を得るには、サブクエリを結合する必要があります。これが機能しない理由を誰かが説明できますか?

4

2 に答える 2

4

どのフィールドがどこに属しているかはわかりませんがtbl_sales_regionalWHERE条件にいくつかのフィールドがあるようです。

ONそれらを句に移動します。

SELECT  item_name, item_num, rst_units
FROM    tbl_item
LEFT JOIN
        tbl_sales_regional
ON      rst_item = item_num
        AND rst_month = 7
        AND rst_customer = 'AB123'

この句は結合の結果に作用するため、これらの条件は、結合によって返されたレコードWHEREに対して真を保持することはできません。NULLtbl_sales_regionalNULL

そのため、オプティマイザーはクエリを内部結合に変換します。

于 2012-11-15T17:59:30.693 に答える
3

句に含まれる条件WHEREは、左結合に関係なく適用され、実質的に内部結合になります。

次のように変更する必要があります。

SELECT item_name,item_num,rst_units
FROM tbl_item left join tbl_sales_regional on item_num=rst_item
AND rst_month=7 and rst_customer='AB123' 
于 2012-11-15T18:00:13.933 に答える