2012-07-13 71 views
1

我已经一个sql scriptone table用于与two alias,并作出JOIN它 但我需要理解为什么以及何时需要它这样做 请详细说明?为什么要使用相同表的别名,做自连接

SELECT 

      ISNULL(MarketValue,0) 
     FROM 
      (     
      SELECT TOP 5 

       Delta, 
       MarketValue  
      FROM 
       (
       SELECT DISTINCT 

        FormatNumber(SUM([CURRENT].MarkToMarket), 0, ',', 0) AS Delta, 
        AVG([CURRENT].Mark) * SUM([CURRENT].Position) AS NumericPosition, 
        FormatNumber(AVG([CURRENT].Mark) * SUM([CURRENT].Position)* CASE WHEN [CURRENT].SecurityType IN ('Equity','Equity Option') THEN 100 ELSE 1 END, 0, ',', NULL) AS MarketValue 
       FROM 
        NAV [CURRENT] 
        LEFT JOIN 
        NAV Compare ON 
        [CURRENT].PurchaseLotId = Compare.PurchaseLotId AND 
        Compare.Date = '2012-06-06' 
       WHERE 

        [CURRENT].SecurityType not in ('Equity') 
       GROUP BY 

       ORDER BY 
        NumericDelta DESC 
      ) Movers 
     FOR XML PATH ('TR'), TYPE 
     ) AS VARCHAR(MAX) 
    ) 

Why it is used like FROM 
        NAV [CURRENT] 
        LEFT JOIN 
        NAV Compare ON 
        [CURRENT].PurchaseLotId = Compare.PurchaseLotId AND 
        Compare.Date = '2012-06-06' 

NAV是只有一个表又是什么做采取同桌NAV(当前)和NAV比较和使用左连接两个别名的目的是什么?

请详细说明一下。

回答

4

您从表中

比较2页的记录时,需要两个不同的别名的代表两个不同的记录。

因此,举例来说,如果你有一台名为Employees:(ID,姓名,经理ID),其中经理ID是员工的直接经理

ID Name  ManagerId 
1  CEO  null 
2  YourBoss  1 
3  You   2 

的ID和你想运行选择您的查询和您的老板的名字:

SELECT emp.Name, mgr.Name 
FROM Employees emp INNER JOIN Employees mgr on emp.ManagerId = mgr.Id 
WHERE emp.Id = 3 
1

资产净值正在与自身连接,所以实际上在导航中每个列都有两个实例。当前和比较用于区分它们。

相关问题