4

SQL Server 2008 を使用しており、次の SQL スクリプトがあります。

Select o.CustomerId as CustomerNoId, OrderValue, OrderDate
From dbo.Orders as o
Inner Join (
    Select Top (10) CustomerId
    From dbo.Customers
    where Age < 60
)
As c
On c.CustomerId = o.CustomerId

これは、ローカルの SQL Server インスタンスで dbo.Customers および dbo.Orders と共に使用すると、必要に応じて機能します。Customers テーブルから返された最初の 10 個の customerIds (1688 行) について、orders テーブルからすべての行が返されます。

ただし、さらに多くの行を含む Customers テーブルと Orders テーブルを保持するリンク サーバーがあります。リンク サーバーから dbo.Orders および dbo.Customers テーブルを使用するようにスクリプトを変更すると、奇妙な結果が得られます。正しいデータが返されたように見えますが、上位 10 行のみが返されます。

私は SQL の専門家ではないので、なぜ異なる動作をする必要があるのか​​ わかりません。

任意の提案をいただければ幸いです。

4

2 に答える 2

4

サブクエリには TOP (10) があり、起動するための ORDER BY はありません。つまり、毎回同じ 10 行を取得できるとは限りません (これは、使用されるアルゴリズムが異なるため、リンク サーバーでは特に当てはまります)照合が同じであっても、照合一致の場合)。

サブクエリに ORDER BY 句を追加して、その部分を一貫して安定させ、残りが正しく続くようにします。

于 2009-09-10T15:07:50.567 に答える
0

まず、ORDER BY@RBarryYoung が指摘したように、句がないとサブクエリが非決定的になります。

次に、最初に結合順序を変更してみます (サブクエリが句の最初のtable_sourceオブジェクトになります)。そうでない場合は、結合ヒントFROMを試してみます。 REMOTE

于 2009-09-10T15:20:14.880 に答える