select语句中的select语句是什么意思?

时间:2012-10-19 20:15:01

标签: sql-server sql-server-2008 tsql

Select中的Transact SQL语句from语句是什么意思?

我的意思是这样的

 .. from ( 
    select .. 
 )

另外,我需要知道声明是否对性能有害。您能否在Transact SQL中为我提供有关此主题的官方文档的链接?

3 个答案:

答案 0 :(得分:3)

我认为你在谈论subquery。子查询用于返回将在主查询中使用的数据,作为进一步限制要检索的数据的条件。

请参阅此链接: - http://www.tutorialspoint.com/sql/sql-sub-queries.htm

答案 1 :(得分:3)

请参阅this link on MSDN about Subquery Fundamentals

子查询可以没问题,但要注意它们没有编入索引。如果查询的外部部分必须连接到子查询的结果,则性能可能会受到影响。请注意,查询优化器也可以为您的查询选择不同的执行顺序,因此即使您从“子查询”开始,优化程序也可以在其他位置启动查询并加入您的子查询。

Correlated Subqueries(Joe Stefanelli在上面的评论中首先链接到这里)是另一个性能问题。每当您有一个必须针对外部查询的结果重复运行的查询时,性能将受到影响。

link about Common Table Expressions (CTEs)。 CTE可能是编写查询的更好方法。子查询的其他替代方法包括@table variables#temporary tables

子查询最常见的用途之一是更新表时。您不能在UPDATE语句的SET列表中拥有聚合函数。您必须在子查询中计算聚合,然后联接回主查询以更新表。例如:

-- A table of state and the total sales per state
declare @States table
(
    ID varchar(2) primary key,
    totalSales decimal(10,2)
)

-- Individual sales per state
declare @Sales table
(
    salesKey int identity(1,1) primary key,
    stateID varchar(2),
    sales decimal(10,2)
)

-- Generate test data with no sales totalled
insert into @States (ID, totalSales)
select 'CA', 0
union select 'NY', 0

-- Test sales
insert into @Sales (stateID, sales)
select 'CA', 5000
union select 'NY', 5500

-- This query will cause an error: 
-- Msg 157, Level 15, State 1, Line 13
-- An aggregate may not appear in the set list of an UPDATE statement.
update @States
set totalSales = SUM(sales)
from @States
inner join @Sales on stateID = ID

-- This query will succeed, because the subquery performs the aggregate
update @States
set totalSales = sumOfSales
from
(
    select stateID, SUM(sales) as sumOfSales
    from @Sales
    group by stateID
) salesSubQuery
inner join @States on ID = stateID

select * from @States

答案 2 :(得分:0)

您可以通过快速搜索找到有关此内容的大量信息。例如,请参阅 来自MSDN的Subquery Fundamentals

  

子查询是嵌套在SELECT,INSERT,UPDATE中的查询,   或DELETE语句,或在另一个子查询中。子查询可以   在任何地方都可以使用表达式。