这可能听起来像一个愚蠢的问题 - 道歉,我是SQL Server的新手,我只想确认一下我的理解。 我有一个查询,它将表中的值聚合为不同列的子查询,例如不同的列,例如对于某一天的交易,在此之前的前一个月,前6个月的交易,之后的交易。
我把主表别名为tx
,然后子查询别名为tx1
,所以我可以使用例如:
tx1.TransactionDate < tx.TransactionDate
我创建了一个列,复制了它并修改了WHERE
条件。
我假设子查询中别名的范围绑定到该子查询,因此在每种情况下别名都相同并不重要。
它似乎有效,但是因为主表tx
都没有被更改,子查询表tx1
也没有。我不知道别名tx1
的范围是否是绑定到每个子查询或初始tx1
是否被重用。
我的假设是否正确?
查询:
SELECT tr.transaction_value ,
Isnull(
(
SELECT Sum(tr1.transaction_value)
FROM [MyDB].[dbo].[Transactions] tr1
WHERE tr1.client_ref = tr.client_ref),0)
and tr1.transaction_date > tr.transaction_date ),0) AS 'Future_Transactions' ,isnull(
(
SELECT sum(tr1.transaction_value)
FROM [MyDB].[dbo].[Transactions] tr1
WHERE tr1.client_ref = tr.client_ref),0)
AND
tr1.transaction_date < tr.transaction_date ),0) AS 'Prior_Transactions' FROM [MyDB].[dbo].[Transactions]
答案 0 :(得分:1)
我认为以下脚本可以解释你的一切。
SELECT 1,1,GETDATE()
INSERT INTO @t ( Id, UserId, TranDate )
SELECT 2,1,GETDATE()
INSERT INTO @t ( Id, UserId, TranDate )
SELECT 3,1,GETDATE()
SELECT tx.Id/*main alias*/,
tx1.Id /*First subquery alias*/,
tx2.Id /*Second subquery alias*/,
(SELECT Id FROM @t txs /*alias only in this one subquery/must be different from main if you want use main alias in it...*/
WHERE txs.Id = tx.Id+2 /*here is used main value = subquery value+2*/) AS Id
FROM @t tx /*main*/
JOIN (SELECT *
FROM @t tx
WHERE tx.Id = 1 /*this one using subquery values + you are not able to use here main value*/
) tx1 --alias of subquery
ON tx.Id = tx1.Id /*here is used main value = subquery value*/
CROSS APPLY (SELECT TOP 1 *
FROM @t txc /*This one must be different from main if you want use it to comparison with main*/
WHERE txc.Id > tx.Id /*this one using subquery value > main value*/
) tx2 --alias of subquery
WHERE tx.Id = 1 AND /*Subquery alias canot reference on First subquery value*/
tx1.Id = 1 AND/*Subquery alias*/
tx2.Id = 2 /*Subquery alias*/
这意味着,是的,它可以被重用,但只有你不想比较main / sub,因为如果你重用它,例如你试图在子查询tx.Id > tx.Id
中做folowing语句它只会导致值在子查询中将进行比较。在我们的例子中,它会导致你没有得到任何东西,因为你在同一行中同谋了......