2010-03-11 30 views
2

這應該真的被允許 - 我不明白爲什麼它不是。可以使用查詢來代替SQL Server中的表格

SELECT * 
FROM (
    SELECT * 
    FROM MyTable 
) 
+1

如果您發佈代碼或XML - **請始終突出顯示有問題的行,然後單擊編輯器工具欄上的「代碼」按鈕(101 010)!這使得它閱讀起來更容易,更好! – 2010-03-11 16:45:36

回答

10

在SQL服務器是允許的,但內部的選擇必須被賦予一個名稱,如:

SELECT * 
FROM ( 
    SELECT * 
    FROM MyTable 
) m 

當一個名稱沒有提供它會拋出一個不正確的語法錯誤ñ耳朵')'消息。

2

至少有兩種方法可以做到這一點,但你可能會尋找一個Common Table Expression (CTE),在SQL Server 2005

介紹,從上面的鏈接:

USE AdventureWorks; 
GO 
WITH Sales_CTE (SalesPersonID, NumberOfOrders, MaxDate) 
AS 
(
    SELECT SalesPersonID, COUNT(*), MAX(OrderDate) 
    FROM Sales.SalesOrderHeader 
    GROUP BY SalesPersonID 
) 
SELECT E.EmployeeID, OS.NumberOfOrders, OS.MaxDate, 
    E.ManagerID, OM.NumberOfOrders, OM.MaxDate 
FROM HumanResources.Employee AS E 
    JOIN Sales_CTE AS OS 
    ON E.EmployeeID = OS.SalesPersonID 
    LEFT OUTER JOIN Sales_CTE AS OM 
    ON E.ManagerID = OM.SalesPersonID 
ORDER BY E.EmployeeID; 
GO 

或者,您可以創建一個View,這是一個可以通過名稱訪問的查詢的永久表形表示形式:

USE AdventureWorks ; 
GO 
IF OBJECT_ID ('hiredate_view', 'V') IS NOT NULL 
DROP VIEW hiredate_view ; 
GO 
CREATE VIEW hiredate_view 
AS 
SELECT c.FirstName, c.LastName, e.EmployeeID, e.HireDate 
FROM HumanResources.Employee e JOIN Person.Contact c on e.ContactID = c.ContactID ; 
GO 
SELECT * FROM hiredate_view 
+0

-1:你不需要一個視圖或CTE來做到這一點,這是一個標準的子查詢。 – RedFilter 2010-03-11 18:07:54

+0

@OrbMan,OP的代碼不使用子查詢。一個子查詢是一個SELECT查詢,它返回一個單一值,並且嵌套在SELECT,INSERT,UPDATE或DELETE語句內或另一個子查詢中。子查詢可以用在任何允許表達式的地方.OP使用派生表,有時稱爲內聯視圖。 – 2010-03-23 17:29:41

+0

@KM - 你是對的。我懶洋洋地使用了名稱*子查詢*作爲括號中的任何查詢的習慣,但派生表是適當的術語,以及我的意思。 – RedFilter 2010-03-23 18:01:47

6

如果添加表別名它應該工作:

SELECT * 
FROM (
    SELECT * 
    FROM MyTable 
) as A 
+0

+1:看起來你贏了28秒。 – RedFilter 2010-03-11 18:09:24

4

你缺少的子查詢 一個「別名」(我加了一個別名「X」)

SELECT * 
FROM (
    SELECT * 
    FROM MyTable 
) X