6

クエリを分析してロジックを抽出しようとしていますが、SELECT FROM tableName(1) という構文を使用する選択ステートメントがいくつか見られます。以下に、この構文が使用されている例をいくつか示します。これはかなり大きな挿入ステートメントなので、クエリ全体を投稿することはできません。

select nh.firm_code, nh.acct_num, nh.sub_code, b.amt
from nav_hist nh(1), breakpoints b
where nh.sales_load_id = b.schedule_id

select sum(weekdays.factor)
from calc_hist weekdays(1)
where weekdays.sys_date >= dateadd(dd, f.usr_num_days - 7, f.sys_date)
      and weekdays.sys_date < f.sys_date
      and c.firm_code = weekdays.firm_code

from ステートメントの (1) の意味を知っている人はいますか?

4

1 に答える 1

9

掘り下げてみましたが、ここで起こっていることは、実際には「(1)」であるクエリヒントを使用していることだと思います。これは INDEX クエリのヒントとして解釈されます。詳細については、こちらを参照してください。

ドキュメントによると、WITH を指定せずにこの形式を使用することは推奨されておらず、2008 年にはこれを実行できませんが、別の特定のバージョンを使用しているか、これに影響する互換モードを使用している可能性があります。

これらの構文を含むクエリについてより多くのリソースを提供していただければ、引き続き調査を進めることができます。

サーバーで実行すると、次のようになります。

select * from sysobjects WITH (1)
--Warning: Index hints supplied for view 'sysobjects' will be ignored.

編集
私はこれをさらに調べましたが、私の仮定が正しいと仮定して、

SELECT 1 FROM TABLENAME(1)

等しい

SELECT 1 FROM TABLENAME WITH (1)

次に、テーブルで使用可能なインデックスの数よりも大きい整数を指定すると例外が発生する場合、以下がポイントを証明します。見てみましょう:

--Table sysjobs has 4 indexes
select * from msdb..sysjobs with (4)
--1 row affected
select * from msdb..sysjobs with (5)
--Msg 307, Level 16, State 1, Line 2
--Index ID 5 on table 'msdb..sysjobs' (specified in the FROM clause) does not exist.
于 2012-05-02T17:14:41.490 に答える