Transact SQL ステートメントSelect
内のステートメントは何をfrom
意味しますか?
私はこのようなことを意味します
.. from (
select ..
)
また、ステートメントがパフォーマンスに悪いかどうかを知る必要があります。Transact SQL のこのトピックに関する公式ドキュメントへのリンクを教えてください。
Transact SQL ステートメントSelect
内のステートメントは何をfrom
意味しますか?
私はこのようなことを意味します
.. from (
select ..
)
また、ステートメントがパフォーマンスに悪いかどうかを知る必要があります。Transact SQL のこのトピックに関する公式ドキュメントへのリンクを教えてください。
See this link on MSDN about Subquery Fundamentals.
Subqueries can be fine, but be warned that they are not indexed. If the outer part of the query must join to the results of the subquery, performance will likely suffer. Note that the query optimizer may also choose a different execution order for your query, so even if you "start from" a subquery, the optimizer may start the query somewhere else and join to your subquery.
Correlated Subqueries (Joe Stefanelli linked here first in the comments above) are another performance problem. Any time you have a query that must be run repeatedly for the results of an outer query, performance will suffer.
See this link about Common Table Expressions (CTEs). CTEs may be a better way to write your query. Other alternatives to subqueries include @table variables and #temporary tables.
One of the most common uses of subqueries is when updating a table. You cannot have an aggregate function in the SET list of an UPDATE
statement. You have to calculate the aggregate in a subquery, then join back to the main query to update the table. For example:
-- 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
について話していると思いますsubquery
。サブクエリは、取得するデータをさらに制限するための条件としてメイン クエリで使用されるデータを返すために使用されます。
このリンクを参照してください:- http://www.tutorialspoint.com/sql/sql-sub-queries.htm
これについては、検索すればたくさんの情報を見つけることができます。たとえば、 MSDNのサブクエリの基礎を参照してください。
サブクエリは、SELECT、INSERT、UPDATE、または DELETE ステートメント内、または別のサブクエリ内にネストされたクエリです。サブクエリは、式が許可されている場所ならどこでも使用できます。