Можно ли использовать запрос вместо таблицы в SQL Server - PullRequest
2 голосов
/ 11 марта 2010

Это действительно должно быть разрешено - я не понимаю, почему это не так.

SELECT * 
FROM (
    SELECT * 
    FROM MyTable
)

Ответы [ 4 ]

10 голосов
/ 11 марта 2010

В SQL Server это разрешено, но внутреннему выбору должно быть присвоено имя, например:

SELECT *  
FROM ( 
    SELECT *  
    FROM MyTable
) m

Если имя не указано, оно выдаст неверную синтаксическую ошибку рядом с сообщением ')'.

6 голосов
/ 11 марта 2010

Если вы добавите псевдоним таблицы, он должен работать:

SELECT * 
FROM (
    SELECT * 
    FROM MyTable
) as A
4 голосов
/ 11 марта 2010

Вам не хватает псевдонима в подзапросе (Я добавил псевдоним 'X')

SELECT * 
FROM (
    SELECT * 
    FROM MyTable
) X
2 голосов
/ 11 марта 2010

Для этого есть как минимум два способа, но вам может понадобиться 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

Кроме того, вы можете создать Представление , которое представляет собой постоянное табличное представление запроса, к которому вы можете обращаться по имени:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...