2012-05-02 42 views
6

我試圖分析查詢提取邏輯和我看到的是使用語法SELECT FROM表名多個SELECT語句(1)。下面是一些正在使用的語法的例子。這是一個相當大的插入語句,所以我無法發佈整個查詢。在TSQL什麼呢表名(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 

有沒有人知道(1)在from語句中的含義?

+0

(1)實際上是後綴到別名。在SQL Server 2005和2012中進行測試會導致語法錯誤'1''附近的語法錯誤。 –

+2

你在看什麼rdbms? – Taryn

+0

這在SQL Server 2008中運行時沒有問題。平日是有效的表名而不是別名。 –

回答

9

我已經做了一些挖掘,我覺得這裏發生了什麼是你實際使用查詢提示這是「(1)」。這是作爲一個INDEX查詢提示INTERPATIONS,你可以閱讀更多關於這些here

根據使用此格式不specificing WITH已被棄用,我不能做到這一點在2008年,但也許您使用的是不同的特定版本或使用影響此一定的兼容性模式文檔。

如果您可以提供包含這些語法查詢更多的資源,我可以繼續挖掘。

這裏是我所得到的,當我在我的服務器上運行:

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

編輯
我進一步調查了這一點,假設我有我的假設是對的,

SELECT 1 FROM TABLENAME(1) 

的Equals

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. 
+0

在上面提供的鏈接中,您可以在Arguments/With下找到它。 http://msdn.microsoft.com/en-us/library/ms187373.aspx – itayw

+0

感謝您的解釋。我仍然不能100%確定開發者爲什麼這樣做,但至少我瞭解了這意味着什麼。 –

+0

酷:)但是,請注意(再次,假設我是正確的),這意味着你可能使用PK進行查詢。也許它不會產生最佳的查詢計劃,並且您想查看它。 – itayw