1

我有一个sql script与它one 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 [CURRENT] 和 NAV 比较并使用 LEFT JOIN 的两个别名的目的是什么?

请详细说明。

4

2 回答 2

4

您正在比较表中的 2 条记录

您需要两个不同的别名来表示两个不同的记录。

例如,如果您有一个名为Employees 的表: (Id, Name, ManagerId) 其中ManagerId 是员工的直属经理的ID

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

你想运行一个查询来选择你和你老板的名字:

SELECT emp.Name, mgr.Name
FROM Employees emp INNER JOIN Employees mgr on emp.ManagerId = mgr.Id
WHERE emp.Id = 3
于 2012-07-13T10:40:27.523 回答
1

NAV 正在与自身连接,因此 nav 中的每一列实际上都有两个实例。Current 和 compare 用于区分它们。

于 2012-07-13T10:43:57.913 回答