SQL中的表连接问题

SQL中的表连接问题,sql,tsql,join,nested-sets,Sql,Tsql,Join,Nested Sets,我在执行以下联接时遇到问题。我以前遇到过这个问题,使用过临时表,但我想知道我做错了什么。基本上,不工作的生产线是倒数第三条。

我在执行以下联接时遇到问题。我以前遇到过这个问题,使用过临时表,但我想知道我做错了什么。基本上,不工作的生产线是倒数第三条。 有什么想法吗


在旁注中,我还看到人们使用十字架和十字架。不是为了说明这是如何工作的,但可能适用于这里?

我认为,尽管尚未测试,但您可以在SQL 2005中将连接更改为交叉应用+

SELECT MID, FAD.FirstOpenedDate ,LCD.LastCloseDate
FROM mwMaster.dbo.Merchant M
JOIN        (
            SELECT MerchID, MIN(moddate) AS FirstOpenedDate
            FROM mwMaster.dbo.MerchantStatusHistory
            GROUP BY MerchID
            )   FAD ON FAD.MerchID = M.MerchID 
LEFT JOIN   (
            SELECT MerchID, MAX(moddate) AS LastCloseDate
            FROM mwMaster.dbo.MerchantStatusHistory
            GROUP BY MerchID
            )   LCD ON LCD.MerchID = M.MerchID
JOIN        (
            SELECT merchid ,avg(Transactions) ,avg(Profit) 
            FROM mwMaster.dbo.ResidualSummary RS
            WHERE RS.Date_Processed < LCD.LastCloseDate
            GROUP BY Merchid    
            )   R ON R.MerchID = M.MerchID 
但使用CTE可能更容易

SELECT MID, FAD.FirstOpenedDate ,LCD.LastCloseDate
FROM mwMaster.dbo.Merchant M
JOIN        (
            SELECT MerchID, MIN(moddate) AS FirstOpenedDate
            FROM mwMaster.dbo.MerchantStatusHistory
            GROUP BY MerchID
            )   FAD ON FAD.MerchID = M.MerchID 
LEFT JOIN   (
            SELECT MerchID, MAX(moddate) AS LastCloseDate
            FROM mwMaster.dbo.MerchantStatusHistory
            GROUP BY MerchID
            )   LCD ON LCD.MerchID = M.MerchID
CROSS APPLY(
        SELECT merchid ,avg(Transactions) ,avg(Profit) 
        FROM mwMaster.dbo.ResidualSummary RS
        WHERE RS.Date_Processed < LCD.LastCloseDate
        GROUP BY Merchid    
        )   R ON R.MerchID = M.MerchID 

没有您的数据,我无法真正测试这一点,但有一种方法可以做到:

 WITH LCD AS (SELECT MerchID, MAX(moddate) AS LastCloseDate
        FROM mwMaster.dbo.MerchantStatusHistory
        GROUP BY MerchID),
  R AS (
              SELECT merchid ,avg(Transactions) ,avg(Profit) 
              FROM mwMaster.dbo.ResidualSummary RS
                   INNER JOIN LCD on 
                   LCD.MERCHID = RS.MERCHID
              WHERE RS.Date_Processed < LCD.LastCloseDate
              GROUP BY Merchid    
            )

SELECT MID, FAD.FirstOpenedDate ,LCD.LastCloseDate
FROM mwMaster.dbo.Merchant M
JOIN        (
            SELECT MerchID, MIN(moddate) AS FirstOpenedDate
            FROM mwMaster.dbo.MerchantStatusHistory
            GROUP BY MerchID
            )   FAD ON FAD.MerchID = M.MerchID 
LEFT JOIN LCD ON LCD.MerchID = M.MerchID
LEFT JOIN R ON R.MerchID = M.MerchID 

你能用通俗易懂的英语解释一下你想在这里实现什么吗?通过使用嵌套查询加入一个表,并在select中的where子句中使用上面创建的表中的一列statment@marc-问题似乎是他想在另一个子查询中使用对子查询的引用,基本上。是否需要最后一次加入?我看不到您引用R子查询中的任何列。@康拉德·弗里克斯:对,但是如果不需要这些列,我们可以消除计算聚合的开销,并可能通过WHERE EXISTS来改进。。。同意,我通常认为CTE是最简单的方法。尽管如此,为什么不在LCD CTE中包含剩余的子选择MINmoddate?联接条件是相同的表和列,左联接与以前需要的联接一样没有意义,可以是相同表/索引查找的一部分。
SELECT MID,
       MIN(moddate) OVER (PARTITION BY MerchID) as FirstOpenedDate,
       MAX(moddate) OVER (PARTITION BY MerchID) as LastCloseDate
FROM mwMaster.dbo.Merchant
HAVING DateProcessed < LastCloseDate