2013-10-18 92 views
0

該搜索條件對於谷歌而言是不明確的。我正在查看一個SQL調用,它有2個FROM關鍵字?我從來沒有見過這個,有人可以解釋嗎?SQL Server - 多個FROM關鍵字?

SELECT TOP(5) SUM(column) AS column, column 
FROM (SELECT DISTINCT column, column, column 
FROM ((((((table table 
INNER JOIN table table ON (column = column 
AND column = 2 
AND column != '')) 
INNER JOIN table table ON (column = column 
AND (column = 144 OR column = 159 OR column = 162 OR column = 164 OR column = 163 OR column = 1 OR column = 2 OR column = 122 OR column = 155 OR column = 156))) 
inner join table table ON (column = column 
AND column = 0)) 
INNER JOIN table ON (column = column )) 
INNER JOIN table table ON (column = column 
AND (column = 102 OR column = 103))) 
INNER JOIN table table ON (column = column ))) TempTable 
GROUP BY column ORDER BY column desc 

您將注意到多個FROM關鍵字。它運行得很好。只是好奇目的是什麼。

+2

您可能會看到一個嵌套的子查詢。 – SLaks

+0

我以爲你需要UNION關鍵字來做到這一點? –

+1

您的省略號可以防止我們看到實際問題 – billinkc

回答

4

這稱爲subquery。您可以在主要查詢中使用subquery 因此,子查詢製作了多個FORM子句。

+0

我不知道爲什麼這會得到downvoted,但upvote將不勝感激 –

+0

聖誕快樂:) –

2

您在子查詢中看到FROM子句。如果您tabify查詢它可能會更明顯

SELECT TOP(5) SUM(column) AS column, column 
FROM ( 
    SELECT DISTINCT column, column, column 
    FROM ((((((table table 
    ... 
    INNER JOIN table table ON (column = column ))) TempTable 
GROUP BY column 
ORDER BY column desc 
+0

我不知道爲什麼這得到downvoted,但upvote將不勝感激 –

2

還有一個原因,SQL被稱爲結構查詢語言:它讓你制定使用其他查詢作爲其來源的查詢,從而創建一個分層查詢結構。

這是一種常見的做法:每個FROM關鍵字實際上與其自己的SELECT配對,使內部查詢成爲外部查詢的源。

正確的格式將幫助您瞭解正在發生的事情:縮進內SELECT小號可以查看您的查詢的結構,使其更容易理解哪一部分被用作其它哪些部分來源:

SELECT TOP(5) SUM(price) AS total_price, item_id 
FROM (-- The output of this query serves as input for the outer query 
    SELECT price, item 
    FROM order -- This may have its own selects, joins, etc. 
    GROUP BY order_id 
) 
GROUP BY item_id 
3

SQL支持SELECT從另一個嵌套的結果SELECT。如前所述,嵌套SELECT被稱爲子查詢。

更多關於子查詢以及它們在MSSQL服務器使用的例子的細節可以在用於選擇成別名的列http://technet.microsoft.com/en-us/library/ms189575(v=sql.105).aspx

子查詢中找到:

USE AdventureWorks2008R2; 
GO 
SELECT Ord.SalesOrderID, Ord.OrderDate, 
    (SELECT MAX(OrdDet.UnitPrice) 
    FROM AdventureWorks.Sales.SalesOrderDetail AS OrdDet 
    WHERE Ord.SalesOrderID = OrdDet.SalesOrderID) AS MaxUnitPrice 
FROM AdventureWorks2008R2.Sales.SalesOrderHeader AS Ord 

WHERE子句中使用的子查詢(從http://www.codeproject.com/Articles/200127/SQL-Joins-and-Subqueries

-- Use a Subquery 
SELECT * FROM AdventureWorks.Person.Address 
WHERE StateProvinceID IN 
(
    SELECT StateProvinceID 
    FROM AdventureWorks.Person.StateProvince 
    WHERE StateProvinceCode = 'CA' 
) 
-- Use a Join 
SELECT addr.* 
FROM AdventureWorks.Person.Address addr 
INNER JOIN AdventureWorks.Person.StateProvince state 
ON addr.StateProvinceID = state.StateProvinceID 
WHERE state.StateProvinceCode = 'CA'