sql - 在SQL中联接表时出现问题

标签 sql tsql join nested-sets

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 

我在执行以下加入时遇到问题。我之前遇到过这个问题,并使用过临时表,但想找出我做错了什么。基本上不起作用的线是倒数第三。 “
有任何想法吗?

在旁注中,我还看到人们使用CROSS和OVER。不了解其工作原理,但可能适用于此?

最佳答案

我认为,尽管尚未测试,但您可以在SQL 2005+中将JOIN更改为CROSS APPLY

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 

但是使用CTE可能会更容易
 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 

关于sql - 在SQL中联接表时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7031467/

相关文章:

mysql - 'ER_PARSE_ERROR' 因为 ?在使用 MySQL 的 url 参数中

MYSQL SELECT 最新条目和 JOIN 表,每个订单号包含多个项目

tsql - 每组累计时间差

sql-server - sql server 中的滚动日历枢轴?

带有 Join 和 union all 的 mysql 查询

PHP MySQL 高分表

MySQL 多列匹配多行结果

sql - 等式查询

javascript - 如何限制 Google Bigquery 中的作业数量

sql - 默认的 T-SQL JOIN 行为是什么,INNER 还是 OUTER?