2010-03-11 31 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