0

次のクエリがあります。

SELECT * 
FROM ZINVN 
WHERE ZINVN.GRID IN
(
        SELECT SMGRID 
        FROM SKU FULL JOIN OTBCLS ON SKU.SKCLCD = OTBCLS.SMCLCD
        WHERE SKSKU=800234
);

このクエリは結果を返しませんが、in 句なしで実行すると、期待される結果が返されます。

また、内部のクエリ()はうまく機能し、期待される結果を返します。

クエリのどこに問題がありますか?

4

1 に答える 1

3

列がどこから来たのかを示すために、クエリにエイリアスを設定する必要があります。また、INNER JOINはFULL OUTER
JOIN よりも高速ですが、これは 2 つの理由からあまり意味がありません
。句の目的のために NULL になるため、LEFT テーブルは何の役にも立たないWHERE SKU=
SMGRIDIN()

SELECT * 
FROM ZINVN 
WHERE ZINVN.GRID IN
(
        SELECT OTBCLS.SMGRID 
        FROM SKU JOIN OTBCLS ON SKU.SKCLCD = OTBCLS.SMCLCD
        WHERE SKU.SKSKU=800234
);

この存在テストは、通常、相関 EXISTS テストを使用して以下の同等の形式で記述した場合に高速に実行されます。

SELECT * 
FROM ZINVN 
WHERE EXISTS (
      SELECT 1
      FROM SKU JOIN OTBCLS ON SKU.SKCLCD = OTBCLS.SMCLCD
      WHERE SKU.SKSKU=800234 AND ZINVN.GRID=OTBCLS.SMGRID
      );

そうは言っても、「ZINVN.GRID」と「OTBCLS.SMGRID」の違いである余分なスペースを確認しましたか?

于 2013-04-24T04:34:36.710 に答える