SQL Server在子查询中重用别名

时间:2016-10-28 11:07:46

标签: sql sql-server tsql sql-server-2012

这可能听起来像一个愚蠢的问题 - 道歉,我是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]

1 个答案:

答案 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语句它只会导致值在子查询中将进行比较。在我们的例子中,它会导致你没有得到任何东西,因为你在同一行中同谋了......