2011-07-20 58 views
2

我有一個簡單的選擇和一個內部聯接查詢。但是,當我使用相同的代碼創建視圖時,結果不同。我沒有從視圖中提取數據。它都是基於用戶表的。查看結果與查詢的代碼相同

QUERY:

SELECT DISTINCT TOP 100 
dbo.table1.a1, 
dbo.table1.a2, 
dbo.table2.something_else FROM dbo.table1 inner join 
dbo.table2 ON 
dbo.tabel1.a1 = dbo.table2.somethingelse 
WHERE dbo.table.a2 = '1' 
ORDER BY dbo.table.a1 DESC 

VIEW:

CREATE VIEW TEST 
AS 

SELECT DISTINCT TOP 100 
dbo.table1.a1, 
dbo.table1.a2, 
dbo.table2.something_else FROM dbo.table1 inner join 
dbo.table2 ON 
dbo.tabel1.a1 = dbo.table2.somethingelse 
WHERE dbo.table.a2 = '1' 
ORDER BY dbo.table.a1 DESC 

當我比較查詢到的結果看,他們似乎是不同的。 VIEW具有更多的結果,然後查詢和訂單不相同(由於VIEW中的記錄比查詢中記錄更多)。它的代碼相同,所以它又有什麼不同?

+0

'SORT'不是T-SQL。 – Yuck

+0

@ user719825,我假設這不是實際的代碼?你能發佈實際的SQL嗎? –

+0

你得到了多少結果? – user606723

回答

4

一般來說,ORDER BY和相關的聲明不允許在視圖創建。簡而言之,結果從視圖中以未定義的順序返回。這可能是爲什麼你也沒有限制前100行,因爲行沒有排序。

將您的訂購和行數從視圖中選擇出來並查看是否有效。

+0

你100%正確。這就是結果不同的原因! – tdjfdjdj

2

我假設你在談論這個查詢:

SELECT DISTINCT TOP 100 PERCENT 
     dbo.table1.a1, 
     dbo.table1.a2, 
     dbo.table2.something_else 
FROM dbo.table1 
JOIN dbo.table2 
ON  dbo.tabel1.a1 = dbo.table2.somethingelse 
WHERE dbo.table.a2 = '1' 
ORDER BY 
     dbo.table.a1 DESC 

在這種情況下,SQL Server運行視圖時只是優化掉ORDER BY部分。

你應該明確地將它添加到調用視圖的查詢:

SELECT * 
FROM test 
ORDER BY 
     a1 DESC 
+0

爲什麼他會把TOP 100 PERCENT?這沒有任何用處。 – user606723

+0

@user:這用於在SQL Server 2000中工作,否則不允許將'ORDER BY'子句放入視圖定義中。 'SQL Server 2005'及更高版本允許使用此語法,但與'2000'不同'優化'ORDER BY'。 – Quassnoi