3

SQL を更新しています。
サブクエリと、相関サブクエリを使用して外部を参照する可能性について読んでいました。
例:

SELECT *  
FROM ORDERS O  
WHERE 'ROAD BIKE' =  
(SELECT DESCRIPTION FROM PART P WHERE P.PARTNUM = O.PARTNUM)  

これは結合と同じです:

SELECT O.ORDEREDON, O.NAME,  
O.PARTNUM, O.QUANTITY, O.REMARKS  
FROM ORDERS O, PART P  
WHERE P.PARTNUM = O.PARTNUM AND P.DESCRIPTION = 'ROAD BIKE'  

私の問題は、最初のフォームと、いつ/なぜそれを使用するのかがわからないことです。外部参照クエリが役立つのはいつですか?

4

3 に答える 3

2

注文には部品番号への参照があるため、Orders テーブルには部品番号への外部キーがあります。

部品番号が「ロードバイク」のすべての注文が必要です。

最初のフォームは、最初にすべてのレコードに対してサブクエリを実行し、O.PARTNUM が「Road Bike」​​の部品番号であるかどうかを確認します。

考え方としては、メイン クエリは Orders テーブルのすべてのレコードを処理します。各レコードでサブクエリを実行し、その PARTNUM フィールドがクエリで使用されます。したがって、サブクエリで Orders レコードの PARTNUM を使用する場合は、その PARTNUM を使用して PART テーブル内のレコードを検索するように選択し、DESCRIPTION フィールドを選択します。次に、メイン クエリの where 句は、"Road Bike" がサブクエリから返された DESCRIPTION と等しいかどうかを確認します。

最初の形式は相関クエリであるため、使用しないことをお勧めします。また、パフォーマンス上の理由から相関クエリを避ける必要があるため、2 番目の形式を使用してください。最初の形式のより良いバージョンは次のとおりです。

SELECT *  
FROM ORDERS O  
WHERE O.PARTNUM =  
(SELECT P.PARTNUM FROM PART P WHERE DESCRIPTION = 'ROAD BIKE')

これは相関クエリではありません。データベースはサブクエリを 1 回実行し、説明として "ROAD BIKE" を含むレコードの PARTNUM を取得してから、WHERE O.PARTNUM がサブクエリの結果と等しいという条件でメイン クエリを実行できます。

于 2013-02-16T21:23:21.630 に答える
2

要するに、疫病のような相関サブクエリは避けるべきです。

相関サブクエリは、外部テーブルの行ごとに内部クエリを 1 回実行します。これにより、ひどいパフォーマンスが発生します (100 万行の外部テーブルでは、内部クエリが 100 万回実行されることになります!)

一方、結合は非常に効率的であり、データベースはそれらを最適化するのに非常に優れています。

可能であれば、相関サブクエリではなく、常にクエリを結合として表現してください。

于 2013-02-16T21:33:15.177 に答える
0

サブクエリが適切なシナリオは、次のようなものです。

select some fields
from some tables
where some conditions are met  
and somefield = (select min(something) from etc)

ただし、それが相関サブクエリかどうかはわかりません。セマンティクスは私の得意分野ではありません。

于 2013-02-16T22:08:52.980 に答える